Use a frozenset https://docs.python.org/3/library/stdtypes.html#frozenset
代替tuple
,这是有序的,您可以使用frozenset
,即无序的, 同时还hashable as frozenset
is 不可变的.
myDict = {}
myDict[frozenset(('A', 'B'))] = 'something'
myDict[frozenset(('B', 'A'))] = 'something else'
print(myDict[frozenset(('A', 'B'))])
将打印:
something else
不幸的是,这种简单性有一个缺点,因为frozenset
基本上是一个“冻结”的集合。中不会有重复的值frozenset
, 例如,
frozenset((1, 2)) == frozenset((1,2,2,1,1))
如果数值的缩减不打扰您,请随意使用frozenset
但是,如果您 100% 确定不希望发生上述情况,那么还有两种选择:
First方法是使用一个Counter
,并使其成为hashable
通过使用frozenset
再次: (注意:元组中的所有内容都必须是hashable)
from collections import Counter
myDict = {}
myDict[frozenset(Counter(('A', 'B')).items())] = 'something'
myDict[frozenset(Counter(('B', 'A')).items())] = 'something else'
print(myDict[frozenset(Counter(('A', 'B')).items())])
# something else
Second方法是使用内置函数sorted
,并使其成为hashable通过使其成为tuple
。这将在用作键之前对值进行排序:(注意:元组中的所有内容都必须是sortable and hashable)
myDict = {}
myDict[tuple(sorted(('A', 'B')))] = 'something'
myDict[tuple(sorted(('B', 'A')))] = 'something else'
print(myDict[tuple(sorted(('A', 'B')))])
# something else
但如果元组元素不全部hashable,也不全是sortable,不幸的是,您可能不走运,需要创建自己的字典结构... D: