为什么我的python OrderedDict被“乱序”初始化了?
这里的解决方案没有解释那么吸引人。这里有一些我就是不明白的东西,也许扩展会对别人和我都有帮助。
>>> from collections import OrderedDict
>>> spam = OrderedDict(s = (1, 2), p = (3, 4), a = (5, 6), m = (7, 8))
>>> spam
OrderedDict([('a', (5, 6)), ('p', (3, 4)), ('s', (1, 2)), ('m', (7, 8))])
>>> for key in spam.keys():
... print key
...
# this is 'ordered' but not the order I wanted....
a
p
s
m
# I was expecting (and wanting):
s
p
a
m发布于 2013-05-15 06:00:12
来自the docs
Python构造函数和update()方法都接受关键字参数,但它们的顺序丢失了,因为
的函数调用语义使用常规无序字典传入关键字参数。
所以初始化失去了顺序,因为它基本上是用**kwargs调用构造函数。
编辑:在解决方案方面(不仅仅是解释)-as指出in a comment by the OP,传入单个元组列表将会起作用:
>>> from collections import OrderedDict
>>> spam = OrderedDict([('s',(1,2)),('p',(3,4)),('a',(5,6)),('m',(7,8))])
>>> for key in spam:
... print(key)
...
s
p
a
m
>>> for key in spam.keys():
... print(key)
...
s
p
a
m这是因为它只有一个参数,一个列表。
发布于 2013-05-15 07:45:59
@Chris Krycho很好地解释了为什么事情会失败。
如果您查看OrderedDict的repr(),您会从一开始就得到关于如何赋予顺序的提示:您需要使用(键,值)对的列表来保持该列表给出的键的顺序。
这是我之前做的一个:
>>> from collections import OrderedDict
>>> spamher = OrderedDict(s=6, p=5, a=4, m=3, h=2, e=1, r=0)
>>> spamher
OrderedDict([('h', 2), ('m', 3), ('r', 0), ('s', 6), ('p', 5), ('a', 4), ('e', 1)])
>>>
>>> list(spamher.keys())
['h', 'm', 'r', 's', 'p', 'a', 'e']
>>>
>>> spamher = OrderedDict([('s', 6), ('p', 5), ('a', 4), ('m', 3), ('h', 2), ('e', 1), ('r', 0)])
>>> list(spamher.keys())
['s', 'p', 'a', 'm', 'h', 'e', 'r']
>>> (碰巧在PythonV3.3.0中,最初的spam示例从一开始就保持键的原始顺序。我换成了spamher来解决这个问题)。
https://stackoverflow.com/questions/16553506
复制相似问题