我正在尝试使用它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)])
我怎样才能确保按照我想要的正确顺序创建它?
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
通过传递几个关键字参数给它的构造.在Python 2.7中,不保证关键字参数的顺序.如果你想要,你将不得不转向Python 3.6,它实现了PEP 468,保留了函数中**kwargs的顺序.
**kwargs
函数定义中的语法指示解释器应收集与其他命名参数不对应的所有关键字参数.但是,Python不保留将这些收集的关键字参数传递给函数的顺序.在某些情况下,订单很重要.此PEP规定收集的关键字参数作为有序映射在函数体中公开.
奇怪的是,它尚未被提及但是表示OrderedDict
如何创建它以便保持顺序:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
它并不意味着表示就像是一个障碍 - 这是因为该表示可以用来创建一个相同的有序OrderedDict
.
只是为了完整性(已经提到过),订单丢失了,因为OrderedDict(a=1, b=2, c=3)
捕获这些参数**kwargs
,这是正常的无序 - dict
.至少直到python 3.6出现并承诺,kwargs
当你传递它时,将保留命令的顺序:
Python 3.6中的新功能PEP 468:保留关键字参数顺序
**kwargs
现在保证函数签名中的插入顺序保持映射.
阅读文档:
OrderedDict构造函数和update()方法都接受关键字参数,但它们的顺序丢失,因为Python的函数使用常规无序字典调用语义传入关键字参数.
您必须将输入作为一系列元组(或现有的有序dict类型)传递以保持排序.
请注意,Python 3.6现在可以保证关键字参数按照它们在代码中出现的顺序(从左到右)传递,这要归功于PEP 468,因此在Python 3.6及更高版本中,您的代码才能正常工作.