【问题标题】:How to extend OrderedDict with defaultdict behavior如何使用 defaultdict 行为扩展 OrderedDict
【发布时间】:2017-07-13 06:48:41
【问题描述】:

我有一个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 对象。

【问题讨论】:

  • 怎么不工作。您应该始终能够详细描述这一点。
  • 请举一个例子说明你得到了什么,另一个例子说明你期望什么。
  • 很可能,它不起作用,因为OrderedDict 不是defaultdict,因此在访问时它不会自动设置默认值。如果只有dict 方法 setdefault...DOTDOT
  • 提及输入、你得到的输出和预期的输出。

标签: python data-structures ordereddictionary defaultdict dictionary-missing


【解决方案1】:

尝试使用添加 defaultdict 行为的子类,而不是常规的 OrderedDict

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

【讨论】:

  • 'TypeError: 'type' 对象没有属性 'getitem''
  • 您的代码中其他地方出现错误。也许您在实例化字典时省略了括号。它应该是 super_dict_apple = OrderedDictWithDefaultList() 而不是 super_dict_apple = OrderedDictWithDefaultList
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2011-12-23
  • 2017-03-10
  • 2020-04-18
相关资源
最近更新 更多