首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python OrderedDict迭代

Python OrderedDict迭代
EN

Stack Overflow用户
提问于 2013-05-15 05:56:16
回答 2查看 41.1K关注 0票数 30

为什么我的python OrderedDict被“乱序”初始化了?

这里的解决方案没有解释那么吸引人。这里有一些我就是不明白的东西,也许扩展会对别人和我都有帮助。

代码语言:javascript
复制
>>> 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-15 06:00:12

来自the docs

Python构造函数和update()方法都接受关键字参数,但它们的顺序丢失了,因为

的函数调用语义使用常规无序字典传入关键字参数。

所以初始化失去了顺序,因为它基本上是用**kwargs调用构造函数。

编辑:在解决方案方面(不仅仅是解释)-as指出in a comment by the OP,传入单个元组列表将会起作用:

代码语言:javascript
复制
>>> 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

这是因为它只有一个参数,一个列表。

票数 37
EN

Stack Overflow用户

发布于 2013-05-15 07:45:59

@Chris Krycho很好地解释了为什么事情会失败。

如果您查看OrderedDict的repr(),您会从一开始就得到关于如何赋予顺序的提示:您需要使用(键,值)对的列表来保持该列表给出的键的顺序。

这是我之前做的一个:

代码语言:javascript
复制
>>> 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来解决这个问题)。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16553506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档