字典如何在python中添加键?

时间:2015-11-19 10:38:52

标签: python dictionary

当我运行代码并将我的范围更改为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

3 个答案:

答案 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,它记住了第一次插入键的顺序。如果新条目覆盖现有条目,则原始插入位置保持不变。删除一个条目并重新插入它将把它移到最后。