【问题标题】:How to sort OrderedDict with a function efficiently?如何有效地使用函数对 OrderedDict 进行排序?
【发布时间】:2019-09-16 07:10:36
【问题描述】:

如果我需要对OrderedDict 进行排序,我曾经使用过这样的语句,效果很好:

from collections import OrderedDict

# defining a dictionary
od = OrderedDict({'a': 5, 'b': 10, 'c': 7})

# ... some changes like adding new keys, removing old keys, etc.

# sorting the dictionary
od_sorted = OrderedDict(sorted(od.items(), key=lambda e: e[1]))

但它有一个缺点:我创建了一个新的 OrderedDict 实例和列表实例(由sorted 提供),如果原始字典很大,则内存使用可能会很昂贵。 有没有一种方法可以在不创建新实例或其他对象的情况下在原始字典中执行排序?我希望找到类似 od.sort(key=lambda ...) 的东西,但没有找到类似的东西:

>>> dir(od)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'move_to_end', 'pop', 'popitem', 'setdefault', 'update', 'values']

我当然看到了How to sort OrderedDict of OrderedDict? 的问题。没有提及建议方法的效率。

【问题讨论】:

  • 效率不高,但有一个move_to_end 方法。 od_keys = (k for k,v in sorted(od.items(), key=lambda e: e[1])); for k in od_keys: od.move_to_end(k)
  • 我的建议是使用sortedcollections 包 -> grantjenks.com/docs/sortedcollections。它具有您期望的界面、您希望的效率,当然还有您想要的排序集合。
  • 请注意,问题的原始修订版包括(仍然)粗体声明“有没有一种方法可以在不创建新实例的情况下在原始字典中执行排序。”你提出的欺骗的每一个答案都没有通过这个试金石。
  • @AdamSmith:我现在看到实际上是 OP,而不是你,在末尾添加了我最初认为的以“我看到了问题”开头的部分......我很抱歉。
  • @martineau 不用担心 :)

标签: python


【解决方案1】:

在您的情况下,您仍然可以使用普通 dict 而不是 OrderedDict,因为您不担心插入顺序。

但如果你真的想将排序任务交给第三方

你仍然可以使用 https://github.com/grantjenks/python-sortedcontainers/

【讨论】:

  • OP 如何只“使用普通的字典”来有效地获得他们想要的东西?
  • 我在问 OP,当您想要的功能是排序而不是 OrderedDict 时,为什么要使用 OrderedDict。
猜你喜欢
  • 2011-12-23
  • 2019-11-26
  • 1970-01-01
  • 2018-10-11
  • 2019-09-11
  • 1970-01-01
  • 2021-01-13
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多