Python 3.5: OrderedDict -- 排序时覆盖self的顺序?

Python 3.5: OrderedDict -- overwrite the order of self when sorted?

目标

在排序时覆盖从 OrderedDict 继承的 class 的顺序。

描述

我有一个 class 继承自 OrderedDict

OrderedDict 文档中可以清楚地看出,可以通过在已排序的键、值元组列表中初始化一个新的来获得已排序的 OrderedDict

OrderedDict(sorted(my_ordered_dict, key=lambda item: item[1]))

这很漂亮,但是因为OrderedDict记得插入顺序甚至当一个键被覆盖时,一个可以简单的加个方法:

def sort_by_value(self):
    self = OrderedDict(sorted(my_ordered_dict, key=lambda item: item[1]))

改变原来的顺序OrderedDict

文档还建议:

def __setitem__(self, key, value):
    if key in self:
        del self[key]
    OrderedDict.__setitem__(self, key, value)

for ''an ordered dictionary variant that remembers the order the keys were last inserted.'' 这并不理想,但会产生所需的行为。

我做了一个假人 class 来尝试这个想法。但是它不起作用。排序后如何覆盖 OrderedDict 的顺序?

虚拟 Class

from collections import OrderedDict
class DumbDictionary(OrderedDict):
    def __init__(self, *args, **kwargs):
        super(DumbDictionary, self).__init__(*args, **kwargs)

    def __setitem__(self, key, value):
        if key in self:
            del self[key]
        DumbDictionary.__setitem__(self, key, value)

    def sort_by_value(self):
        self = DumbDictionary(sorted(self.items(), key=lambda item: item[1])) 

不幸的是,覆盖 self 不起作用,因为它会破坏对原始对象的引用。因此,可以通过将 superOrderedDict 的方法之一结合使用来达到预期的结果,如下所示:

def sort_by_value(self):
    post_sort =sorted(self.items(), key=lambda item: item[1]))
    for key, value in post_sort:
        super(DumbDictionary, self).move_to_end(key)