Python OrderedDict不保持元素顺序

时间:2013-03-31 19:25:51

标签: python python-2.7 ordereddictionary

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

这就是我的所作所为:

from collections import OrderedDict
od = OrderedDict({(0,0):[2],(0,1):[1,9],(0,2):[1,5,9]})

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

od
OrderedDict([((0, 1), [1, 9]), ((0, 0), [2]), ((0, 2), [1, 5, 9])])

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

1 个答案:

答案 0 :(得分:91)

您的问题是,您正在构建dict以向OrderedDict提供初始数据 - 此dict 不会存储任何订单,因此订单在到达OrderedDict之前就已丢失。

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

>>> 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])])

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

编辑:As of Python 3.6, kwargs is ordered,因此您可以使用关键字参数,前提是您使用的是最新的Python版本。

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

相关问题