Python 3.5:OrderedDict - 在排序时覆盖自我的顺序?

时间:2016-12-04 15:03:27

标签: python sorting dictionary ordereddictionary

目标

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

描述

我有一个继承自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) 的排序。

文档还建议:

OrderedDict

for''一个有序的字典变体,它记住上次插入密钥的顺序。''哪个不理想,但会产生所需的行为。

我尝试了这个想法。但它不起作用。如果对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])) 进行排序后如何覆盖它?

Dummy Class

{{1}}

1 个答案:

答案 0 :(得分:0)

不幸的是,覆盖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)