0

私のプログラムの1つに問題があります。いくつかのリストがあり、それらはすべて同じ長さです。リストはオリジナルのリストを組み合わせたものです。必要なのは、特定の要素が複数回繰り返されるインデックスです。例えば:

a = ["x","t","y"]
b = ["t","x","y"]
c = ["t","t","y"]

2回してほしい。

4

4 に答える 4

1
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]]はさらに高速です:

于 2013-06-14T22:19:41.667 に答える
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
于 2013-06-14T21:16:25.083 に答える
0

一発ギャグ:

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
于 2013-06-14T21:18:02.197 に答える