对成对测试,如何使成对元素的顺序无关紧要?

5 python set python-3.x

这是我想要做的:

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"
Run Code Online (Sandbox Code Playgroud)

有没有办法可以使一对中的元素顺序无关紧要,所以当O进行成员资格测试时:

bad_combos.add((m3,m4))

if (m4,m3) in bad_combos:

   #This will return True?
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激!提前致谢!

Jim*_*ard 2

您拥有的一个选择(如果bad_combos 必须保留一组)是将frozensets 添加到您的集合中,然后检查该对的冻结集合是否存在:

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
Run Code Online (Sandbox Code Playgroud)

当然,这保留了成员资格测试的 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")
Run Code Online (Sandbox Code Playgroud)

当然,这会导致 O(n) 成员资格测试。