如何扩展有序字典(OrderedDict)以具有默认字典(defaultdict)的行为

5

我有一组OrderedDict对象列表。 我想将它们全部组合在一起,然后按其中每个对象中的水果属性进行排序。我一直在尝试使用下面的代码使用defaultdict组合和排序它们:

super_dict_apple = defaultdict(list)
super_dict_orange = defaultdict(list)
super_dict_no_fruit = defaultdict(list)


for d in dict:
        if 'fruit' not in d:
            for k, v in d.iteritems():
                super_dict_no_fruit[k].append(v)
        elif d['fruit'] == 'Apple':
            for k, v in d.iteritems():
                super_dict_apple[k].append(v)
        elif d['fruit'] == 'orange':
            for k, v in d.iteritems():
                super_dict_orange[k].append(v)  

使用该方法,我可以获取一个键及其所有相关的值,但是我会失去原本的顺序。因此我尝试使用OrderedDict来解决问题,但是我无法使其正常工作。以下是我的尝试:

from collections import OrderedDict

order_dict_no_fruit = OrderedDict()
order_dict_apple = OrderedDict()
order_dict_orange = OrderedDict()

for d in dict:
        if 'fruit' not in d:
            for k, v in d.iteritems():
                order_dict_no_fruit[k].append(v)
        elif d['fruit'] == 'Apple':
            for k, v in d.iteritems():
                order_dict_apple[k].append(v)
        elif d['fruit'] == 'orange':
            for k, v in d.iteritems():
                order_dict_orange[k].append(v) 

我的主要目标是保持字典的原始顺序,但根据水果键将它们合并为三个不同的OrderedDict对象。


2
它为什么不工作?你应该总是能够详细描述它。 - juanpa.arrivillaga
1
请展示一个你所得到的例子,以及另一个你所期望的例子。 - Soviut
可能是因为OrderedDict不是defaultdict,所以在访问时它不会自动设置默认值,导致代码无法正常工作。如果只有一个setdefault方法的话,那该多好啊...DOTDOT - juanpa.arrivillaga
1
提及输入、输出和预期输出。 - Rohan
1个回答

9

不要使用普通的OrderedDict,而是尝试使用一个子类,它添加了defaultdict的行为:

class OrderedDictWithDefaultList(OrderedDict):
    def __missing__(self, key):
        value = list()
        self[key] = value
        return value

类型错误:'type' 对象没有属性 'getitem'。 - user3609179
你的代码其他地方出现了错误。也许在实例化字典时,你忘记加上括号了。应该是“super_dict_apple = OrderedDictWithDefaultList()”,而不是“super_dict_apple = OrderedDictWithDefaultList”。 - Raymond Hettinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接