【发布时间】: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