字典插入顺序

时间:2017-12-17 22:05:37

标签: python-2.7 dictionary while-loop

我想知道为什么这段代码的输出不符合事物列表。输出时,代码为{0: 0, 2.0: 0.5, 4: 1, 5: 1}而不是{4: 1, 5: 1, 2.0: 0.5, 0: 0}。谢谢你的帮助。

ctr = 0
rtc = 1
things = [4,5,2.0,0]
d = {}

#block 1
    while ctr < len(things):
    d[things[ctr]] = things[ctr] / 4 
    ctr += 1
print d

2 个答案:

答案 0 :(得分:0)

使用标准的Python字典,无法保证元素将按插入顺序保留。您应该使用

  

OrderedDict

如果您想要这种行为,请从集合包中

对于Python 2.7,请参阅

中OrderedDict集合的官方文档

https://docs.python.org/2/library/collections.html#collections.OrderedDict

您的示例,已修改:

import collections

ctr = 0
rtc = 1
things = [4,5,2.0,0]
d = collections.OrderedDict()


while ctr < len(things):
    d[things[ctr]] = things[ctr] / 4 
    ctr += 1
print d

输出:

OrderedDict([(4,1),(5,1),(2.0,0.5),(0,0)])

按键访问元素类似于普通的字典:

print d[4]
print d[2.0]

分别给出1和0.5。

答案 1 :(得分:0)

正如其他人所指出的那样,python词典并不保证可以按照与插入顺序相同的顺序访问这些项目。这是因为python列表和字典是不同的数据结构,每个数据结构都有自己的检索值的方法。如果您对此感兴趣,请查看这个惊人的video以了解字典项的存储和检索方式,以及不保留订单的原因。

如果您只想根据things中的项目打印或访问字典中的项目,除了Ordereddict之外,还有以下几个选项。

列表理解

>>> print [(key, d[key]) for key in things]                                                                                                          
[(4, 1), (5, 1), (2.0, 0.5), (0, 0)]
>>> print "{ %s }" % ", ".join(["%s : %s" % (key, d[key]) for key in d])
{ 0 : 0, 2.0 : 0.5, 4 : 1, 5 : 1 }

您还可以根据things列表

对字典进行排序
>>> print sorted(d.items(), key = lambda x: things.index(x[0]))
[(4, 1), (5, 1), (2.0, 0.5), (0, 0)]