私のプログラムの1つに問題があります。いくつかのリストがあり、それらはすべて同じ長さです。リストはオリジナルのリストを組み合わせたものです。必要なのは、特定の要素が複数回繰り返されるインデックスです。例えば:
a = ["x","t","y"]
b = ["t","x","y"]
c = ["t","t","y"]
2回してほしい。
私のプログラムの1つに問題があります。いくつかのリストがあり、それらはすべて同じ長さです。リストはオリジナルのリストを組み合わせたものです。必要なのは、特定の要素が複数回繰り返されるインデックスです。例えば:
a = ["x","t","y"]
b = ["t","x","y"]
c = ["t","t","y"]
2回してほしい。
map(lambda x: x.count(x[0]) == len(x), zip(*[a, b, c])).index(True)
x.count(x[0]) == len(x)
よりもはるかに高速ですlen(set(x)) == 1
より大きなサブリストの場合 > 20 要素lambda x: x == len(x)*[x[0]]
はさらに高速です:
私はあなたがこのようなものを探していると思います:
>>> a = ["x","t","y"]
>>> b = ["t","x","y"]
>>> c = ["t","t","y"]
>>> lis = [a, b, c]
>>> next( i for i,x in enumerate(zip(*lis)) if len(set(x)) == 1)
2
zip(*lis)
リストを解凍すると、次のようになります。
>>> lis = [a, b, c]
>>> zip(*lis)
[('x', 't', 't'), ('t', 'x', 't'), ('y', 'y', 'y')]
これで、この新しいリストの各項目を繰り返し処理し、すべての項目が等しいインデックスを確認できます。Aset
はそれを確認する最良の方法です。
>>> set(('y', 'y', 'y'))
set(['y']) #length is 1
一発ギャグ:
filter(lambda x : a[x] == b[x] and a[x] == c[x], range(len(a)))
すべての要素が一致するインデックスを含むリストが返されるため、結果として[2]
ではなく、実際に取得されることに注意してください2
。
(リストではなく)整数値だけが必要な場合:
idxs = filter(lambda x : a[x] == b[x] and a[x] == c[x], range(len(a)))
result = idxs[0] if idxs else None