Python OrderedDict不保持元素顺序

Eco*_*tan 49 python ordereddictionary python-2.7

我正在尝试创建一个OrderedDict对象但是我刚创建它,而不是元素都混乱.

这就是我做的:

from collections import OrderedDict
od = OrderedDict({(0,0):[2],(0,1):[1,9],(0,2):[1,5,9]})
Run Code Online (Sandbox Code Playgroud)

元素不会按照我指定的顺序保留

od
OrderedDict([((0, 1), [1, 9]), ((0, 0), [2]), ((0, 2), [1, 5, 9])])
Run Code Online (Sandbox Code Playgroud)

docs.python.org没有一个例子,我无法弄清楚为什么订单变得混乱.任何帮助是极大的赞赏.

Gar*_*tty 92

您的问题是您正在构建一个dict将初始数据提供给OrderedDict- 这dict 存储任何订单,因此订单在到达之前就会丢失OrderedDict.

解决方案是从有序数据类型构建 - 最简单的listtuples:

>>> from collections import OrderedDict
>>> od = OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])])
>>> od
OrderedDict([((0, 0), [2]), ((0, 1), [1, 9]), ((0, 2), [1, 5, 9])])
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这就是为什么OrderedDict使用它为它的字符串表示所做的语法 - 字符串表示应该尝试在有可能的情况下重现对象的有效Python代码,这就是输出使用元组列表而不是字典的原因.

编辑:从Python 3.6开始,按kwargs顺序排序,因此您可以使用关键字参数,前提是您使用的是最新的Python版本.

从3.7开始,对于dicts 也是如此(对于3.6中的CPython,但是语言规范没有指定它,因此OrderedDict仍然需要使用兼容性).这意味着如果你可以假设一个3.7+环境,你通常可以OrderedDict完全放弃,或者dict如果你需要一个特定的功能(例如:为了平等而重要),从常规构建一个.

  • 另外值得注意的是,将名称/值传递给构造函数不足以设置顺序.`>>>来自集合导入OrderedDict`` >>> OrderedDict(一个= 1,两个= 2,三个= 3,四个= 4)``OrderedDict([('four',4),('one',1 ),('三',3),('二',2)])` (12认同)
  • @GarethLatty现在在[python 3.6](https://docs.python.org/3/whatsnew/3.6.html#pep-468-preserving-keyword-argument-order)中实现了PEP-468 (2认同)