我在OS X Mavericks上使用python 2.7.5,我看到了一个字典,我用来生成一个简单的文本菜单。我的问题是:是Python字典中的整数键,按优先级排序和排序?我可以看到mainMenu_1
字典(包含一些数字键和一些字符串键)对整数键进行排序然后以预期的随机顺序呈现字符串键。 mainMenu_2
按预期随机化。
来自python 2.7.8 docs:
“最好将字典视为一组无序的键:值 对,要求密钥是唯一的(在一个内 字典)。“
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'}
答案 0 :(得分:5)
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 + randomly seeds the hash某些(非int)类型,如果使用-R flag运行,早期版本也会这样做。
答案 1 :(得分:2)
根据我刚刚执行的一些简单测试,确实就像你说的那样 - 我在 Python 3.4.0
中测试它我不知道发生这种情况的原因。我认为没有理由想到
“最好将字典视为一组无序的键:值对,要求键是唯一的(在一个字典中)。”
以任何方式误导或不真实。这是完全正确的:即使我们可以看到幕后有一些排序,你永远不应该依赖它。这就是为什么文档会说出他们说的话。他们也可以向后排序整数键,没有人应该关心 - 您的实现不能依赖于该机制。
那说 - 还是一个不错的发现!