这是我想要做的:
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)
任何想法将不胜感激!提前致谢!
您拥有的一个选择(如果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) 成员资格测试。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |