繁体   English   中英

Python 字典中的整数键是否按优先级排序和排序?

[英]Are the integer keys in a Python dictionary sorted and sorted with priority?

我在 OS X Mavericks 上使用 python 2.7.5,我看到我用来生成简单文本菜单的字典出现意外行为。 我的问题是: Python 字典中的整数键是否按优先级排序和排序? 我可以看到mainMenu_1字典(包含一些数字键和一些字符串键)对整数键进行排序,然后以预期的随机顺序显示字符串键。 mainMenu_2按预期随机化。

来自 python 2.7.8 文档:

“最好将字典视为一组无序的键:值对,要求键是唯一的(在一个字典中)。”

mainMenu_1 = {
   0: 'README',
   1: 'New Set',
   2: 'View Sets',
   3: 'Quiz',
   4: 'Scores',
   5: 'Configuration Settings',
   'Q': 'Quit',
   'a': 'additional letter to test',
   'b': 'additional letter to test'
}

mainMenu_2 = {
   'one': 'README',
   'two': 'New Set',
   'three': 'View Sets',
   'four': 'Quiz',
   'five': 'Scores',
   'six': 'Configuration Settings',
   'Q': 'Quit',
   'd': 'another letter to test'
}

print mainMenu_1.keys()
[0, 1, 2, 3, 4, 5, 'a', 'Q', 'b']
print mainMenu_2.keys()
['four', 'Q', 'five', 'three', 'd', 'six', 'two', 'one']

第三个测试:

c = {1:'one','two':'two',3:'three'}
print c
{1: 'one', 3: 'three', 'two': 'two'}

dict根据其底层哈希表桶进行“排序”(大量使用引用指针)。 整数的hash()本身就是:

hash(42)
Out[29]: 42

...但这并不一定意味着较低的整数将出现在较高的整数之前,因为哈希取模表大小以将其分配给一个桶。

d = {i:i for i in range(250,260)}

print(d)
{256: 256, 257: 257, 258: 258, 259: 259, 250: 250, 251: 251, 252: 252, 253: 253, 254: 254, 255: 255}

所以连续的整数不一定在dict排序。 至于整数获得优先级,不,整数没有什么特别之处。 它们的散列值特别好地聚集在一起,并且您碰巧选择了一些散列比该丛集更大(同样是模表大小)的字符串。

hash('roippi')
Out[26]: 8915818834981308633

hash('roippi') % 8 # min hashtable size in py2 is 3-bit
Out[27]: 1

d = {0:'', 'roippi':0, 2:0}

print(d)
{0: '', 'roippi': 0, 2: 0}

所有这些当然是 cPython 的一个实现细节,所以唯一可以保证的是排序是“任意但一致的1 ”。

1至少在 Python 解释器的单次运行中保持一致。 3.2.3+ 随机种子某些(非整数)类型的散列,如果使用-R 标志运行,早期版本也会这样做。

根据我刚刚执行的一些简单测试,确实像您说的那样-我在Python 3.4.0 中对其进行了测试

我不知道发生这种情况的原因。 我看不出有什么理由去想

“最好将字典视为一组无序的键:值对,要求键是唯一的(在一个字典中)。”

以任何方式误导或不真实。 这是完全正确的:即使我们可以看到在幕后进行了一些排序,但您永远不应该依赖它 这就是为什么文档说他们所说的。 他们也可以向后排序整数键,没有人应该关心- 您的实现不能依赖该机制。

也就是说 - 仍然是一个不错的发现!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM