5

I have a list of OrderedDict objects. I would like to combine all of them together and then sort them by the fruit attribute in each of them. I have been trying to combine and sort them using defaultdict using the code below:

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)  

With this I get one key and all the associated values, but I lose the original order. So I tried to do it with an OrderedDict, but I cannot get it to work. This is what I tried:

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) 

My main goal is to keep the original order of the dictionaries but combine them into three different OrderedDict objects based on the fruit keys.

spazm
  • 4,399
  • 31
  • 30
user3609179
  • 301
  • 8
  • 20

1 Answers1

9

Instead of a regular OrderedDict, try a subclass that adds in defaultdict behavior:

class OrderedDictWithDefaultList(OrderedDict):
    def __missing__(self, key):
        value = list()
        self[key] = value
        return value
Raymond Hettinger
  • 216,523
  • 63
  • 388
  • 485
  • 'TypeError: 'type' object has no attribute '__getitem__'' – user3609179 Feb 23 '17 at 00:35
  • You've got an error elsewhere in your code. Perhaps you left off the parentheses off when instantiating the dictionaries. It should be ``super_dict_apple = OrderedDictWithDefaultList()`` instead of ``super_dict_apple = OrderedDictWithDefaultList``. – Raymond Hettinger Feb 23 '17 at 00:58