4

2タプルの別のリストで一致する2タプルを見つける最も簡単な方法は何ですか?

次のコードは非常に非効率に見えます。loc1とloc2は、(x、y)座標のタプルのリストです。

loc3=[]
for loc in loc1:
    if loc in loc2:
        loc3.append(loc)

ハッシュが鍵だと思いますが、Pythonでそれを行う方法がわかりません。エレガントなコードを教えてください。ありがとう。

4

1 に答える 1

9

セットとintersection:を使用できます

loc3 = set(loc1).intersection(loc2)

これにより、set順序付けされておらず、重複が含まれない(そして、アイテムがハッシュ可能であることを強制する)が得られます。それが問題である場合は、PhilFrostによる他の回答を参照してください。ただし、順序や重複が不要な場合は、これが大幅に効率的になります。

重複を含めることができるが、(内のloc2)アイテムのハッシュ可能性を必要とする順序保存ソリューションは次のとおりです。

sloc2 = set(loc2)
loc3 = [ item for item in loc1 if item in sloc2 ]  #still O(m)

Pythonでは、asetは単なるハッシュテーブルです。アイテムがそのセットに含まれているかどうかを確認することは、アイテムの位置がハッシュによって検出されるため、(ほぼ)O(1)操作です。

于 2013-01-08T00:48:25.570 に答える