【问题标题】:Python 3.5: OrderedDict -- overwrite the order of self when sorted?Python 3.5:OrderedDict - 排序时覆盖 self 的顺序?
【发布时间】:2017-04-19 00:03:03
【问题描述】:

目标

在排序时覆盖从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)

for ''一个有序的字典变体,它记住最后插入键的顺序。'' 这并不理想,但会产生所需的行为。

我已经创建了一个虚拟课程来尝试这个想法。但是它不起作用。排序后如何覆盖OrderedDict 的排序?

虚拟类

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])) 

【问题讨论】:

    标签: python sorting dictionary ordereddictionary


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-05
      • 2017-05-28
      • 2023-03-14
      • 2020-06-16
      • 2011-10-04
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多