当前位置:  开发笔记 > 编程语言 > 正文

OrderedDict没有订购?

如何解决《OrderedDict没有订购?》经验,为你挑选了3个好方法。

我正在尝试使用它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)])

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



1> TigerhawkT3..:

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(zip("abc",(1,2,3)))`也可以
@ShadowRanger - 关于[是否] [https://docs.python.org/3.6/whatsnew/3.6 .html #new-dict-implementation)基本的`dict`类型除了CPython实现细节之外都被排序为,但是,是的,关键字参数正式是3.6的语言的一部分.
呵呵.没有意识到他们实际上决定记录这种行为并保证它.很高兴知道.
@Copperfield - 是的,它向构造函数发送一个参数,然后以类似于演示循环的方式迭代该参数.该参数永远不会被发送到任意排序的容器,它是一个序列,所以它的顺序是有保证的.

2> MSeifert..:

奇怪的是,它尚未被提及但是表示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 现在保证函数签名中的插入顺序保持映射.


可能值得一提的是[该文档链接中的以下项目](https://docs.python.org/3.6/whatsnew/3.6.html#new-dict-implementation)现在说Python 3.6中的简单`dict`维护插入顺序,但目前应该"被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现为所有当前和未来的Python实现强制命令保留语义"

3> ShadowRanger..:

阅读文档:

OrderedDict构造函数和update()方法都接受关键字参数,但它们的顺序丢失,因为Python的函数使用常规无序字典调用语义传入关键字参数.

必须将输入作为一系列元组(或现有的有序dict类型)传递以保持排序.

请注意,Python 3.6现在可以保证关键字参数按照它们在代码中出现的顺序(从左到右)传递,这要归功于PEP 468,因此在Python 3.6及更高版本中,您的代码才能正常工作.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有