- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建一个以两个字符串作为键的字典,并且我希望这些键可以按任意顺序排列。
myDict[('A', 'B')] = 'something'
myDict[('B', 'A')] = 'something else'
print(myDict[('A', 'B')])
我希望这段代码打印“其他内容”。不幸的是,顺序似乎对元组很重要。用作键的最佳数据结构是什么?
最佳答案
frozenset
您可以使用 frozenset
,而不是有序的 元组
,无序,同时 可散列 因为 frozenset
是不可变的。
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% 确定不希望上述情况发生,则有两种选择:
第一个方法是使用一个Counter
,并再次使用frozenset
使其可散列
:(< strong>注意:元组中的所有内容都必须可散列)
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
第二种方法是使用内置函数sorted
,并通过将其设为元组使其可散列
。这将在将值用作键之前对值进行排序:(注意:元组中的所有内容都必须可排序和可散列)
myDict = {}
myDict[tuple(sorted(('A', 'B')))] = 'something'
myDict[tuple(sorted(('B', 'A')))] = 'something else'
print(myDict[tuple(sorted(('A', 'B')))])
# something else
但是,如果元组元素既不是全部可散列,也不是全部可排序,不幸的是,您可能运气不好,需要创建自己的字典结构。 .. D:
关于python - 键顺序无关紧要的多键字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46633065/
我特别从那些IBM/联想、惠普、戴尔(也许)制造的“商务”笔记本电脑的倡导者那里听到“商务用户不需要高质量的屏幕”。他们坚持使用最糟糕的液晶显示器(即使分辨率很高)并且敢于出售那些垃圾。您甚至无法区分
我被这个问题困了两天了,还是没搞定。 基本上,我有一个二维数组,其中包含某些数字(在给定范围内)之间的关系: 0 = 顺序无关紧要 1 = 第一个数字(左栏中的数字)应该是第一个 2 = 第二个数字(
我是一名优秀的程序员,十分优秀!