2

リスト内の特定のパターンを見つける関数を作成しようとしています。たとえば、リストを取得すると

x = [1,1,2,3,54,3,1]

次に、パターン y がリスト x に表示されるかどうかを確認します。

y = [1,1,n,n,n,n,1]

ここで、n は任意の数を表します。したがって、私の例ではTrueを返します。

any() 関数を調べましたが、あまりうまくいきませんでした。

4

6 に答える 6

3
>>> from operator import itemgetter
>>> x = [1, 1, 2, 3, 54, 3, 1]
>>> itemgetter(0,1,6)(x) == (1, 1, 1)
True

どのようにy 実際に定義されています。n明らかに、プレースホルダーとしてそこに入れることはできませんか? Noneおそらく使用できますか?

于 2013-03-28T04:15:32.990 に答える
1
from itertools import izip, islice
x = [2,1,3,1,1,2,3,54,3,1,5,6,7,1,1,0,0,0,0,1]
y = [1,1,None,None,None,None,1]

print [i for i in xrange(len(x)-len(y)+1) 
         if all(b is None or a==b for a,b in izip(islice(x, i, i+len(y)), y))]

または、理解しやすいコードを追加します。

def nwise(x, n):
    for i in xrange(len(x)-n+1):
        yield i, islice(x, i, i+n)

def match(x, y):
    return all(b is None or a==b for a,b in izip(x, y))

print [i for i, xs in nwise(x, len(y)) if match(xs, y)]
于 2013-03-28T04:16:39.173 に答える
1

意味が分からず困っていると思いますany。一連の値をチェックし、それらのいずれかが「真」であるかどうかを確認するために使用されます。これは、値が「任意の数」または「これらの可能性のいずれか」であるかどうかを調べることとは関係ありません。

set考慮したい固定された有限の可能性がある場合、本当に知りたいのは、候補値がinそのセットであるかどうかです。

x in {1, 2, 3, 4, "hi mom"} # returns whether x is any of those values

しかし、「任意の数」は有限集合ではありません。まず、 numberの意味を定義する必要があります。そして、適切なテストを実行する必要があります。あなたがやろうとしているのは、値が整数かどうかを確認することです。つまり、リスト内の値のに関心があります。

それらがすべて整数であることがすでにわかっている場合は、テストする必要はありません。値が何であるかを気にしない場合は、チェックを行うときに考慮しないでください。しかし、それが整数であることを確認する必要がある場合、その方法は次のとおりです。

isinstance(x, int) # returns whether x is an `int`

しかし、長いリストの任意の時点で実際にパターンを探したいときに、たまたま「パターン」と同じ長さの「検索リスト」の例を挙げて、を混乱させたかもしれません。

その場合、同じ長さのリストに対してパターンの完全一致を行う関数を作成できます。次にany、パターン長のサブリストが一致するかどうかを確認するために使用します。anyジェネレータ式で使用するように設計されており、次のようになります。

def match(a_sublist, the_pattern):
    # put your logic here

def search(the_full_list, the_pattern):
    pattern_length, full_length = len(the_pattern), len(the_full_list)
    return any(
        match(the_full_list[i:i+pattern_length], the_pattern)
        for i in range(full_length - pattern_length)
    )

パターンの詳細に応じて、文字列検索アルゴリズムと正規表現エンジンに触発された、より効率的な照合方法があります。しかし、それはもっと難しい内容になっています - 上記はあなたを始めるはずです。

于 2013-03-28T04:21:16.520 に答える
0
x = [1,1,2,3,54,3,1]
y = [1,1,0,0,0,0,1]
any([i[0]==i[1] for i in zip(x,y)])
于 2013-03-28T05:16:08.417 に答える
0

パターンが一致したリストを検索したいと思います..

x = [[1,1,2,3,54,3,1],[1,2,3,4,5,6,7],[2,4,6,8,10,12,14]]
y = [1,1,None,None,None,None,1] ## or [1,1,'n','n','n','n',1]

for l in x:
    if all(map(lambda x:x[0]==x[1],[x for x in zip(l,y) if x[1] and x[1]!='n'])):
        print l

出力:

[1,1,2,3,54,3,1]
于 2013-03-28T04:32:06.640 に答える
0

このタイプの問題は、 Numpyの マスクされた配列に適しています。

import numpy.ma as ma

x = ma.array([1,1,2,3,54,3,1])
y = ma.array([1,1,1,1,1,1,1], mask=[0,0,1,1,1,1,0])

print x==y           # [True True -- -- -- -- True]
print ma.all(x==y)   # True

もちろん、ここでの使用は numpy のインストールとインポートに値しないかもしれませんが、状況によっては利点があります。

于 2013-03-28T04:55:35.850 に答える