Pythonic Way to reverse nested dictionaries

list-comprehension, python

Solution

collections.defaultdict makes this pretty simple:

from collections import defaultdict
import pprint

data = {
 'Bob' : {'item1':3, 'item2':8, 'item3':6},
 'Jim' : {'item1':6, 'item4':7},
 'Amy' : {'item1':6,'item2':5,'item3':9,'item4':2}
}

flipped = defaultdict(dict)
for key, val in data.items():
    for subkey, subval in val.items():
        flipped[subkey][key] = subval

pprint.pprint(dict(flipped))

Output:

{'item1': {'Amy': 6, 'Bob': 3, 'Jim': 6},
 'item2': {'Amy': 5, 'Bob': 8},
 'item3': {'Amy': 9, 'Bob': 6},
 'item4': {'Amy': 2, 'Jim': 7}}

Problem

I have a nested dictionary of people and item ratings, with people as the key. people may or may not share items. Example: ``` { 'Bob' : {'item1':3, 'item2':8, 'item3':6}, 'Jim' : {'item1':6, 'item4':7}, 'Amy' : {'item1':6,'item2':5,'item3':9,'item4':2} } ``` I'm looking for the simplest way to flip these relations, and have a new nested dictionary with items as the key. Example: ``` {'item1' : {'Bob':3, 'Jim':6, 'Amy':6}, 'item2' : {'Bob':8, 'Amy':5}, 'item3' : {'Bob':6, 'Amy':9}, 'item4' : {'Jim':7, 'Amy':2} } ``` What is the best way to do this? Is it possible with a comprehension?

Original source