1

У меня есть список orderdicts. И я хотел бы объединить их все вместе, а затем отсортировать по атрибуту плода в каждом из них. Я должен был комбинировать и сортировать их с использованием defaultdict через код ниже.Как продлить OrderedDict с поведением по умолчанию

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) 

С этим я получаю один ключ и все связанные значения, но я теряю первоначальный заказ. Поэтому я попытался сделать это с помощью orderDict, но я не могу заставить его работать, ниже - то, что я пробовал.

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) 

Моя главная цель состоит в том, чтобы сохранить первоначальный порядок словарей, но объединить их в три различных orderDicts на основе фруктовых ключей.

+2

** Как это не работает **. Вы должны всегда быть в состоянии описать это подробно. –

+1

Пожалуйста, покажите пример того, что вы получаете, и еще один пример того, что вы ожидаете. – Soviut

+0

Вероятно, это не работает, потому что 'OrderedDict' не является' defaultdict', поэтому при доступе он автоматически не устанавливает значение по умолчанию. Если только существует метод 'dict', который * setdefault * ... DOTDOT –

ответ

2

Вместо обычного OrderedDict, попробуйте подкласс, который добавляет в defaultdict поведения:

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

Кажется, я получаю эту ошибку. – user3609179

+0

'ТипError:' type 'объект не имеет атрибута' __getitem__ '' – user3609179

+0

У вас есть ошибка в другом месте вашего кода. Возможно, вы отказались от круглых скобок при создании словарей. Это должно быть '' super_dict_apple = OrderedDictWithDefaultList() '' вместо '' super_dict_apple = OrderedDictWithDefaultList''. –

Смежные вопросы