私は2つの非常に大きなリストPとQを持っていて、Qの中にあるPのアイテムを見つけたいと思います。セットを使うことを示唆する他のスレッドを読んでいますが、 。私は次の行が必要性を満たすと思う:これは重複を見つけるか、セットを使用することをお勧めし、合理的かつ最速の方法であれば2つの大きなリスト間でオーバーラップが見つかった
overlap = [l for l in P if l in Q]
はしかし、私は思ったんだけど?
ありがとうございました。
私は2つの非常に大きなリストPとQを持っていて、Qの中にあるPのアイテムを見つけたいと思います。セットを使うことを示唆する他のスレッドを読んでいますが、 。私は次の行が必要性を満たすと思う:これは重複を見つけるか、セットを使用することをお勧めし、合理的かつ最速の方法であれば2つの大きなリスト間でオーバーラップが見つかった
overlap = [l for l in P if l in Q]
はしかし、私は思ったんだけど?
ありがとうございました。
@AChampionによって提案されたように、この目的のために効率的です。興味のある人のためのコードはここにあります。大きなリスト、Qをリストに変換するだけで、
larger_list_set = set(Q)
overlap = [l for l in P if l in larger_list_set]
の方が効率的です。
もしあなたがsetを使うことに頼るなら、 'overlap = set1.intersection(set2)'メソッドを使うこともできます。 – exfizik
大きな「N」の場合、「セット」に「Q」を回すと、パフォーマンスに著しい影響があります。現在、これは 'O(N^2)'です。つまり、 'P'の各項目は' Q 'に 'O(N)'ルックアップを必要とします。あなたが 'O(N)'を話しているセットでは、 'P'の各アイテムは' set(Q) 'でO(1)ルックアップを必要とします。 'set(Q)'が 'N 'の値が大きいほど打ち消される' 'O(N)'の構築時間があります。 '' O(N) ''と書いてあります。 – AChampion
@AChampion:OPのアルゴリズムは 'O(N^2)'であり、 'Q'を集合に変換することはその順序を持つものではありません。 –
はい、それは明確でない場合は申し訳ありません。より多くの情報があれば、最適/簡単な解決策を特定することが可能である。 'collections.Counter()'を使ってマルチセットを作成します。 – AChampion