首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OrderedDict没有订餐吗?

OrderedDict没有订餐吗?
EN

Stack Overflow用户
提问于 2017-01-26 04:31:10
回答 5查看 9.3K关注 0票数 31

我正在尝试使用一个OrderedDict,但它一直是无序创建的。例如,

代码语言:javascript
复制
from collections import OrderedDict
OrderedDict(a=1,b=2,c=3)

收益率

代码语言:javascript
复制
OrderedDict([('a', 1), ('c', 3), ('b', 2)])

而不是预期的

代码语言:javascript
复制
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

我怎样才能确保它是按照我想要的顺序创建的呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-01-26 04:36:56

collections.OrderedDict跟踪元素被添加到其中的顺序。这在循环中工作得很好:

代码语言:javascript
复制
c = collections.OrderedDict()
for a,b in zip('abc', (1,2,3)):
    c[a] = b

但是,表达式OrderedDict(a=1,b=2,c=3)通过向构造函数传递几个关键字参数来创建OrderedDict。在Python2.7中,不能保证关键字参数的顺序。如果您想要这样做,您必须转到Python3.6,它实现了PEP 468,函数中的kwargs

函数定义中的**kwargs语法表明解释器应该收集与其他命名参数不对应的所有关键字参数。但是,Python并没有保留将收集到的关键字参数传递给函数的顺序。在某些情况下,秩序很重要。此PEP指示将收集到的关键字参数作为有序映射公开在函数体中。

票数 55
EN

Stack Overflow用户

发布于 2017-01-26 05:33:35

奇怪的是,还没有提到它,但是OrderedDict的表示形式向您展示了如何创建它,以便保持顺序:

代码语言:javascript
复制
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

这并不意味着表示是那样的障碍--这是因为表示可以用来创建一个相同的有序OrderedDict

为了完整起见(前面已经提到过),订单丢失了,因为OrderedDict(a=1, b=2, c=3)将这些参数捕获为**kwargs,这是一个正常的无序-dict。至少在python3.6出现并创建了承诺之前,当您像以前一样传递它时,kwargs的顺序将保持不变:

Python 3.6的新特性 PEP 468:保留关键字参数顺序 函数签名中的**kwargs现在保证是一个保持插入顺序的映射.

票数 19
EN

Stack Overflow用户

发布于 2017-01-26 04:34:29

读取医生们

OrderedDict构造函数和update()方法都接受关键字参数,但是由于函数调用语义使用常规无序字典传递关键字参数,它们的顺序丢失了。

您必须将输入作为元组序列(或现有有序的dict类型)传递,以保持顺序。

请注意,Python3.6现在是提供关键字参数按代码中显示的相同顺序传递(从左到右)的保证。,这要感谢佩普468,因此在Python3.6和更高版本上,您的代码将只能工作。

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

https://stackoverflow.com/questions/41866911

复制
相关文章

相似问题

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