为什么我的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
@Chris Krycho很好地解释了为什么事情会失败。
如果您查看OrderedDict的repr(),您会得到一个如何从一开始就传递顺序的提示:您需要使用(键、值)对的列表来保持列表中给定键的顺序。
我之前做过一个:
(恰好在Python v3.3.0中,
spam
的原始示例从一开始就保持键的原始顺序。我改成了spamher
来解决这个问题)。正如otheranswers所提到的,试图将dict传递给orderedict或使用关键字参数并不能保持顺序。不过,传入元组有点难看,这是Python。它应该很漂亮。
您可以对类使用
__getitem__
,以便使用类似dict的语法创建OrderedDict“literals”:现在可以使用类似dict的语法创建OrderedDict:
这是因为在方括号内,Python创建slice文本,如果您稍微斜视一下,这些文本看起来就像dict语法。
OD
类可以从错误检查中获益,但这演示了它如何工作。来自the docs:
因此初始化失去了顺序,因为它基本上是用
**kwargs
调用构造函数。编辑:根据解决方案(不仅仅是解释)-正如in a comment by the OP所指出的,传入一个元组列表将工作:
这是因为它只得到一个参数,一个列表。
相关问题 更多 >
编程相关推荐