2016-11-13 7 views
-1

私は2つの非常に大きなリストPとQを持っていて、Qの中にあるPのアイテムを見つけたいと思います。セットを使うことを示唆する他のスレッドを読んでいますが、 。私は次の行が必要性を満たすと思う:これは重複を見つけるか、セットを使用することをお勧めし、合理的かつ最速の方法であれば2つの大きなリスト間でオーバーラップが見つかった

overlap = [l for l in P if l in Q] 

はしかし、私は思ったんだけど?

ありがとうございました。

+1

大きな「N」の場合、「セット」に「Q」を回すと、パフォーマンスに著しい影響があります。現在、これは 'O(N^2)'です。つまり、 'P'の各項目は' Q 'に 'O(N)'ルックアップを必要とします。あなたが 'O(N)'を話しているセットでは、 'P'の各アイテムは' set(Q) 'でO(1)ルックアップを必要とします。 'set(Q)'が 'N 'の値が大きいほど打ち消される' 'O(N)'の構築時間があります。 '' O(N) ''と書いてあります。 – AChampion

+0

@AChampion:OPのアルゴリズムは 'O(N^2)'であり、 'Q'を集合に変換することはその順序を持​​つものではありません。 –

+0

はい、それは明確でない場合は申し訳ありません。より多くの情報があれば、最適/簡単な解決策を特定することが可能である。 'collections.Counter()'を使ってマルチセットを作成します。 – AChampion

答えて

0

@AChampionによって提案されたように、この目的のために効率的です。興味のある人のためのコードはここにあります。大きなリスト、Qをリストに変換するだけで、

larger_list_set = set(Q) 
overlap = [l for l in P if l in larger_list_set] 

の方が効率的です。

+0

もしあなたがsetを使うことに頼るなら、 'overlap = set1.intersection(set2)'メソッドを使うこともできます。 – exfizik

関連する問題