【问题标题】:Python OrderedDict not keeping element order [duplicate]Python OrderedDict 不保持元素顺序[重复]
【发布时间】:2013-03-21 22:39:14
【问题描述】:

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

【问题讨论】:

    标签: python python-2.7 ordereddictionary


    【解决方案1】:

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

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

    >>> 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.7dicts 也是如此(它适用于 3.6 中的 CPython,但语言规范没有指定它,因此仍然需要使用 OrderedDict 以实现兼容性)。这意味着,如果您可以假设 3.7+ 环境,您通常可以完全删除 OrderedDict,或者如果您需要特定功能(例如:为了平等),则从常规 dict 构建一个。

    【讨论】:

    • 另外值得注意的是,将名称/值传递给构造函数不足以设置顺序。 >>> from collections import OrderedDict>>> OrderedDict(one=1, two=2, three=3, four=4)OrderedDict([('four', 4), ('one', 1), ('three', 3), ('two', 2)])
    • @EricSmith 实际上,出于同样的原因 - Python 中的变量关键字 args (**kwargs) 存储为字典 - 所以当这种情况发生时,顺序会像以前一样丢失。请注意,PEP-468 对此有一个简单的解决方案 - 将 OrderedDict 用于 kwargs,这还不是一个功能,但也许有一天。
    • @GarethLatty 现在在 python 3.6 他们实施了 PEP-468
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2015-12-31
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多