覆盖排序时从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]))
进行排序后如何覆盖它?
{{1}}
答案 0 :(得分:0)
不幸的是,覆盖self不起作用,因为它会破坏对原始对象的引用。因此,通过将super
与OrderedDict
方法之一结合使用,可以获得所需的结果,如下所示:
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)