我有一个名为dict
的{{1}}:
tmp
我遍历了这个>>> tmp
{1: 'ONE', 2: 'TWO', 3: 'THREE'}
>>> type(tmp)
<type 'dict'>
二十次,在所有迭代中,我得到了相同顺序的键列表。
dict
我知道python dict的订单少于但是为什么我在相同的订单中获得密钥&#34;总是&#34; ?
答案 0 :(得分:3)
您在tmp
的来电之间不会修改tmp.keys()
,因此密钥的顺序永远不会改变。
如果
items()
,keys()
,values()
,iteritems()
,iterkeys()
和itervalues()
被调用而没有对字典进行干预,列表将直接对应。这允许使用(value, key)
:zip()
创建pairs = zip(d.values(), d.keys())
对。iterkeys()
和itervalues()
方法使用相同的关系:pairs = zip(d.itervalues(), d.iterkeys())
为对提供相同的值。另一种创建相同列表的方法是pairs = [(v, k) for (k, v) in d.iteritems()]
。
答案 1 :(得分:1)
创建一个dict后,python会创建自己的命令。每当您拨打.keys()
或.values()
或.items()
时,只要您不修改字典,每次都会在相同的顺序中获得无序结果。希望这是有道理的。
正如您在下面的示例中所看到的,即使我创建了具有特定顺序的字典,python也会重新排序字典。但是,在此之后,订单始终保持不变(只要您不修改字典)。
a = {'apple' : 'fruit', 'car' : 'vehicle', 'onion' : 'vegetable'}
print a
for i in range(5):
print a.keys()
[OUTPUT]
{'car': 'vehicle', 'apple': 'fruit', 'onion': 'vegetable'}
['car', 'apple', 'onion']
['car', 'apple', 'onion']
['car', 'apple', 'onion']
['car', 'apple', 'onion']
['car', 'apple', 'onion']
答案 2 :(得分:1)
因为否则,这不起作用:
for key, value in zip(d.keys(), d.values()):
...
以及各种类似的问题。
只要不修改dict / set ,Python的dict和set类型就保证具有相同的迭代顺序。尝试向tmp
添加其他值,下次有机会获得不同的订单。
(但是,请注意小整数作为键不是一个特别好的例子,它是如何工作的 - 小整数在CPython中自行散列,所以它们可能更容易出现在数值中尝试一些字符串。)
答案 3 :(得分:1)
由于python dict是作为哈希表实现的,因此键的顺序基于其哈希值,该哈希值决定哪个槽用于存储“键/值”对。
对于整数值作为键,哈希值只是整数本身
>>> map(hash, [1,2,3])
[1,2,3]
这里使用的密钥是连续的int,它们的哈希值也是连续的,下面的哈希算法很有可能选择连续的槽来存储“密钥/值”对,这就是为什么你看到相同的顺序你创造了这个词典。这是一个简单的反例:
>>> tmp = {1:1, 5:5, 10:10}
>>> tmp.keys()
[1, 10, 5]
当然,在循环期间,您不会修改字典,这不会导致哈希表调整大小,因此订单仍然存在。
>>> for i in range(5):
... print tmp.keys()
[1, 10, 5]
[1, 10, 5]
[1, 10, 5]
[1, 10, 5]
[1, 10, 5]
如果您对Python中的详细实现感兴趣,请查看这篇好文章: Python dictionary implementation