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 不起作用,因为它会破坏对原始对象的引用。因此,可以通过将 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)
目标
在排序时覆盖从 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 不起作用,因为它会破坏对原始对象的引用。因此,可以通过将 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)