12

Python (2.7) で 2 つのリストを交差させたいと思います。結果を反復可能にする必要があります。

list1 = [1,2,3,4]
list2 = [3,4,5,6]
result = (3,4) # any kind of iterable

完全な反復を提供すると、交差後に最初に実行されますが、次のうちどれがより効率的ですか?

ジェネレーターの使用:

result = (x for x in list1 if x in list2)

filter() の使用:

result = filter(lambda x: x in list2, list1)

他の提案?

前もってありがとう、
アムノン

4

4 に答える 4

26

これらのどちらでもありません。最良の方法は、セットを使用することです。

list1 = [1,2,3,4]
list2 = [3,4,5,6]
result = set(list1).intersection(list2)

セットは反復可能であるため、結果を何かに変換する必要はありません。

于 2011-06-16T09:16:52.603 に答える
8

ソリューションの複雑さはO(m*n)、です。ここでmnは2つのリストのそれぞれの長さです。O(m+n)リストの1つにセットを使用することで、複雑さを改善できます。

s = set(list1)
result = [x for x in list2 if x in s]

読みやすさよりも速度が重要な場合(つまり、ほとんどない場合)は、次を使用することもできます。

result = filter(set(a).__contains__, b)

これは、私のマシンの他のソリューションよりも約20パーセント高速です。

于 2011-06-16T09:16:59.280 に答える