当我运行代码并将我的范围更改为1时,我得到了我期望的范围,当我将范围设置为2时,我仍然得到前2组我正确的顺序一旦我告诉它添加第三组他们不再按顺序(添加的最新项目不会放在最后)。为什么这个/什么是确定最新项目放在字典中的位置的规则?
coded2 = []
for char in coded:
coded2.append(char)
plain2 = []
for char in plain:
plain2.append(char)
i = 0
d = {}
for num in range(5):
d[coded2[i]] = plain2[i]
i += 1
print d
答案 0 :(得分:3)
在Python中,词典是无序的。这些项目不按其输入顺序存储。如果您希望保存订单,可以使用OrderedDict
。
from collections import OrderedDict
d = OrderedDict()
for num in range(5):
d[num] = num
print d #OrderedDict([(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])
答案 1 :(得分:2)
在python中dict
实际上是一个list
,它有一个哈希函数来生成索引。
散列函数由python公开:
>>> hash
<built-in function hash>
请注意,在python 3中更改了哈希函数:
<强> Python2.7.10 强>
>>>>>> hash("foo")
-740391237
<强> Python3.5.0 强>
>>> hash("foo")
866150152168011056
键入
时mydict = {}
真正发生的事情是python会分配一个大小为8的空列表。
当你现在开始向mydict
python添加项目时,将计算项目的哈希值,并考虑 3个最低有效位来计算列表中的索引:
def bits(integer):
return "".join(str(x) for x in [1&(integer>>i) for i in range(32)[::-1]])
>>>for item in "myitem","hashfunction","python":
print(bits(hash(item))[-3:])
101
100
000
因此,使用这些键的dict将具有与您预期不同的顺序:
>>> mydict={}
>>> mydict["myitem"]=None
>>> mydict["hashfunction"]=None
>>> mydict["python"]=None
>>> print mydict
{'python': None, 'hashfunction': None, 'myitem': None}
它们是dict中哈希的最后三位数的顺序。
随着dict越来越充分,python将重新分配它并使用不同的哈希值,对于小词典(高达128k)它将四倍大小,对于更大的词组,它将*加倍其大小* *。当dict获得2/3满时,就会发生这种重新分配。
>>> keys=["myitem","hashfunction","python","in","a","super","large","dict"]
>>> for item in keys:
print(item, bits(hash(item))[-5:])
('myitem', '01101')
('hashfunction', '00100')
('python', '01000')
('in', '10111')
('a', '00000')
('super', '11100')
('large', '10000')
('dict', '10100')
>>>mydict={key:None for key in keys}
>>>print mydict
{'a': None, 'hashfunction': None, 'python': None,
'myitem': None, 'large': None, 'dict': None, 'in': None, 'super': None}
这意味着dict
中的订单会在您投入更多项目时发生变化,有时甚至是根本上。
请注意,dict只会增加其大小,永远不会缩小它的del
个项目。
要详细了解dict
及其处理方式hash collisions,我建议Brandon Rhodes 优秀 Pycon2010谈论dict
的内部运作:{{3 }}
底线是dict
中你不应该依赖它的顺序。
Raymond Hettinger在OrderedDict
模块中实施了collections
课程。
from collections import OrderedDict
d = OrderedDict()
for num in range(5):
d[num] = num
print d #OrderedDict([(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])
它继承自dict
,但包含一些代码以记住添加密钥的顺序。您可以依赖OrderedDict
。
答案 2 :(得分:0)
您可以在这里使用OrderDict
根据Link:
有序词典就像常规词典一样,但它们记住了项目的插入顺序。迭代有序字典时,项目按照其键首次添加的顺序返回。
class collections.OrderedDict([items]) 返回一个dict子类的实例,支持通常的dict方法。 OrderedDict是一个dict,它记住了第一次插入键的顺序。如果新条目覆盖现有条目,则原始插入位置保持不变。删除一个条目并重新插入它将把它移到最后。