我正在尝试使用一个OrderedDict,但它一直是无序创建的。例如,
from collections import OrderedDict
OrderedDict(a=1,b=2,c=3)收益率
OrderedDict([('a', 1), ('c', 3), ('b', 2)])而不是预期的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])我怎样才能确保它是按照我想要的顺序创建的呢?
发布于 2017-01-26 04:36:56
collections.OrderedDict跟踪元素被添加到其中的顺序。这在循环中工作得很好:
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指示将收集到的关键字参数作为有序映射公开在函数体中。
发布于 2017-01-26 05:33:35
奇怪的是,还没有提到它,但是OrderedDict的表示形式向您展示了如何创建它,以便保持顺序:
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现在保证是一个保持插入顺序的映射.
发布于 2017-01-26 04:34:29
读取医生们
OrderedDict构造函数和update()方法都接受关键字参数,但是由于函数调用语义使用常规无序字典传递关键字参数,它们的顺序丢失了。
您必须将输入作为元组序列(或现有有序的dict类型)传递,以保持顺序。
请注意,Python3.6现在是提供关键字参数按代码中显示的相同顺序传递(从左到右)的保证。,这要感谢佩普468,因此在Python3.6和更高版本上,您的代码将只能工作。
https://stackoverflow.com/questions/41866911
复制相似问题