2017-09-12 9 views
5

は、私が何をしたいです:ペアのメンバーシップテストは、どのようにペアの要素の順序を無関係にするのですか?ここ

m1 = (a,b) 
m2 = (c,d) 
bad_combos = set() 
bad_combos.add((m1,m2)) #((a,b),(c,d)) 
... #adding many other elements in the set 

#when i do this: 
if (m2,m1) in bad_combos: 
    print("Found") 
else: 
    print("Not Found") 

#the result is always "Not Found" 

は、Oは、メンバーシップのテストを行うとき、私はペア内の要素の順序は無関係で作ることができる方法はあります:

bad_combos.add((m3,m4)) 

if (m4,m3) in bad_combos: 

    #This will return True? 

任意のアイデア大いに感謝されます! ありがとうございました!

+2

順序が重要でない場合は、 'tuple'(ペア)の代わりに' set'を使用することができます – Phydeaux

答えて

2

一つのオプション:

m1 = ('a','b') 
m2 = ('c','d') 
bad_combos = set() 
bad_combos.add(frozenset([m1,m2])) 

(m2, m1) in bad_combos # False 

frozenset([m2, m1]) in bad_combos # True 

これはもちろん、メンバーシップテストのためのO(1)の複雑さを保持します。

別のオプション(セットは必須ではありません場合)あなたが保存するデータ構造としてリストに切り替えると、それにセットのペアを加えることを含む:

m1 = ('a','b') 
m2 = ('c','d') 
bad_combos = [] 
bad_combos.append({m1,m2}) #((a,b),(c,d)) 

if {m2,m1} in bad_combos: 
    print("Found") 
else: 
    print("Not Found") 

このOで、もちろん、結果(N)メンバーシップテスト。

+0

を更新しました。' frozenset'のメンバシップテストのコストは、 'set'のメンバと同じで、常にO(1)ですか?または、両者のパフォーマンスに違いはありますか? –

+0

@Hanあなたはまだセットを使用しています(2番目のシナリオでは)、タプルとは対照的に、不変のセットであるそれにfrozensetsを追加するだけです:-)。メンバーシップはまだ 'O(1)'です。 –

+0

ありがとうございます! @ジムファサラキスヒリアード –

4

通常、注文が問題でない場合はtupleの代わりにsetを使用してください。

ただし、別のセットにセットを追加することはできません。この場合は、使用することができますfrozenset

bad_combos セットを滞在する必要がある場合)ペアのfrozensetのが存在する場合、あなたのセットに frozenset Sを追加し、チェックされている
m1 = (a, b) 
m2 = (c, d) # m1 and m2 are tuples 

bad_combos = set() 
bad_combos.add(frozenset({m1,m2})) # {m1,m2} is a set 
# ... 
if frozenset({m2,m1}) in bad_combos: 
    # True 
+1

変更可能なコレクション(セット)をセットに追加することはできません。私は4人*がこれに気付かなかったことに驚いています。 –

+0

上記のコードを試してみるとエラーになります:** TypeError:Unhashable type:set **修正するにはどうしたらいいですか? @Phydeaux –

+1

'frozenset'を使う – dawg

関連する問題