这是我想要做的:
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?
任何想法将不胜感激! 在此先感谢!
答案 0 :(得分:4)
一般情况下,如果订单无关紧要,请使用set
代替tuple
。
但是,您无法将一组添加到另一组。在这种情况下,您可以使用frozenset
:
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 :(得分:2)
您拥有的一个选项(如果bad_combos
必须保留一套)是将frozenset
添加到您的集合中,然后检查对的冻结集是否存在:
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)成员资格测试。