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?