50

我正在尝试创建一个 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 没有示例,我无法弄清楚为什么订单会变得混乱。任何帮助是极大的赞赏。

4

1 回答 1

92

您的问题是您正在构建 adict以将初始数据提供给OrderedDict- 这dict 存储任何订单,因此订单在到达OrderedDict.

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

>>> 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 代码以尽可能重现对象,这就是输出使用元组列表而不是 dict 的原因。

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

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

于 2013-03-31T19:27:29.490 回答