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

时间:2017-09-12 13:24:30

标签: python python-3.x set

这是我想要做的:

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 个答案:

答案 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)成员资格测试。