【问题标题】:Is it possible to initialize an empty OrderedDict in Python with a predefined sorting mechanism?是否可以使用预定义的排序机制在 Python 中初始化一个空的 OrderedDict?
【发布时间】:2015-01-11 05:13:30
【问题描述】:

我能找到的所有示例(in the documentation 等)都通过将数据传递给构造函数来定义 OrderedDicts。来自文档:

# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by key
OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

另一方面,可以通过不向构造函数提供参数来初始化 OrderedDict,这会导致它保留键值对添加的顺序。

我正在寻找一种类似于以下的构造,除了没有“d.items()”。本质上,我要求它记住一个机制而不提供一个例子,这听起来可能很疯狂。我唯一的选择是通过为单个项目提供初始“d”(如下)来“破解”这个问题,还是有更好的方法?

OrderedDict(sorted(d.items(), key=lambda t: t[0]))

谢谢!

【问题讨论】:

  • 是的,这是默认行为吗?
  • 排序字典不会在插入时重新排序其内容。它们记住插入顺序并且可以排序,但它们不只是在添加键时自动排序。为此,您正在寻找类似 SortedCollection 的东西。 IIRC 有一个使用 bisect 模块的配方 (code.activestate.com/recipes/577197-sortedcollection),但仅靠 OrderedDict 是不够的。
  • 您可以自己滚动,或许可以考虑使用heapq 来保留内部顺序

标签: python python-2.7 python-3.x ordereddictionary


【解决方案1】:

OrderedDict 只有一种排序算法:插入顺序。无论项目添加到OrderedDict 的顺序是OrderedDict 的顺序。

如果您想要其他方法,您可以编写您的 dict 子类,或者只是一个排序函数,您可以在订单实际上很重要时应用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多