リスト内の特定のパターンを見つける関数を作成しようとしています。たとえば、リストを取得すると
x = [1,1,2,3,54,3,1]
次に、パターン y がリスト x に表示されるかどうかを確認します。
y = [1,1,n,n,n,n,1]
ここで、n は任意の数を表します。したがって、私の例ではTrueを返します。
any() 関数を調べましたが、あまりうまくいきませんでした。
リスト内の特定のパターンを見つける関数を作成しようとしています。たとえば、リストを取得すると
x = [1,1,2,3,54,3,1]
次に、パターン y がリスト x に表示されるかどうかを確認します。
y = [1,1,n,n,n,n,1]
ここで、n は任意の数を表します。したがって、私の例ではTrueを返します。
any() 関数を調べましたが、あまりうまくいきませんでした。
>>> from operator import itemgetter
>>> x = [1, 1, 2, 3, 54, 3, 1]
>>> itemgetter(0,1,6)(x) == (1, 1, 1)
True
どのようにy
実際に定義されています。n
明らかに、プレースホルダーとしてそこに入れることはできませんか? None
おそらく使用できますか?
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)]
意味が分からず困っていると思います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)
)
パターンの詳細に応じて、文字列検索アルゴリズムと正規表現エンジンに触発された、より効率的な照合方法があります。しかし、それはもっと難しい内容になっています - 上記はあなたを始めるはずです。
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)])
パターンが一致したリストを検索したいと思います..
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]
このタイプの問題は、 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 のインストールとインポートに値しないかもしれませんが、状況によっては利点があります。