10

2 つのフラット リストがあり、そのうちの 1 つに重複する値が含まれています。例えば、

array1 = [1,4,4,7,10,10,10,15,16,17,18,20]
array2 = [4,6,7,8,9,10]

array2にもあるarray1の値を見つけ、array1に重複を保持する必要があります。望ましい結果は

result = [4,4,7,10,10,10]

実際の配列には数百万を超える値が含まれるため、ループを回避したいと考えています。さまざまなセットと交差の組み合わせを試しましたが、重複を維持できませんでした..

4

3 に答える 3

7

ループを使いたくないというのはどういう意味ですか? 何らかの方法でそれを繰り返す必要があります。各アイテムを個別に取り込んで、入っているかどうかを確認しarray2てください。

items = set(array2)
found = [i for i in array1 if i in items]

さらに、結果をどのように使用するかに応じて、ジェネレーターを使用することを検討してください。

found = (i for i in array1 if i in array2)

一度にすべてをメモリに入れる必要がないようにします。

于 2014-10-30T21:12:35.140 に答える
5

以下がそれを行います:

array1 = [1,4,4,7,10,10,10,15,16,17,18,20]
array2 = [4,6,7,8,9,10]
set2 = set(array2)
print [el for el in array1 if el in set2]

要素の順序と繰り返しを保持しarray1ます。

array2ルックアップを高速化するためのセットに変わります。これは、array2が十分に大きい場合にのみ有益であることに注意してください。array2が小さい場合は、リストとして保持する方がパフォーマンスが向上する場合があります。

于 2014-10-30T21:13:20.337 に答える