Pythonic方式来反转嵌套的词典

GSt*_*Sto 12 python list-comprehension

我有一个人和项目评级的嵌套字典,以人为关键.人们可能会也可能不会分享项目.例:

{
 'Bob' : {'item1':3, 'item2':8, 'item3':6},
 'Jim' : {'item1':6, 'item4':7},
 'Amy' : {'item1':6,'item2':5,'item3':9,'item4':2}
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找最简单的方法来翻转这些关系,并有一个新的嵌套字典,以项目为关键.例:

{'item1' : {'Bob':3, 'Jim':6, 'Amy':6},
 'item2' : {'Bob':8, 'Amy':5},
 'item3' : {'Bob':6, 'Amy':9},
 'item4' : {'Jim':7, 'Amy':2}
}
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?理解是否可能?

Rya*_*rom 19

collections.defaultdict使这很简单:

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))
Run Code Online (Sandbox Code Playgroud)

输出:

{'item1': {'Amy': 6, 'Bob': 3, 'Jim': 6},
 'item2': {'Amy': 5, 'Bob': 8},
 'item3': {'Amy': 9, 'Bob': 6},
 'item4': {'Amy': 2, 'Jim': 7}}
Run Code Online (Sandbox Code Playgroud)

  • 为了方便起见这个功能并没有真正用于默认,恕我直言,因为没有它就真的很容易,只需添加"flipped.setdefault(subkey,{})"这一行就行了 (7认同)