Python - 按键值分组dicts列表,将单独的键值计为dict?

Slo*_*pax 0 python dictionary list

我正在尝试将名称键值组合在一起作为dict值的键,并将源值计为所述父键的键,并将计数值作为其值.

data = [
{'name':'Gill', 'source':'foo'},
{'name':'Gill', 'source':'foo'},
{'name':'Gill', 'source':'foo'},
{'name':'Gill', 'source':'bar'},
{'name':'Gill', 'source':'bar'},
{'name':'Gill', 'source':'bar'},
{'name':'Gill', 'source':'bar'},
{'name':'Gill', 'source':'bar'},
{'name':'Dave', 'source':'foo'},
{'name':'Dave', 'source':'foo'},
{'name':'Dave', 'source':'foo'},
{'name':'Dave', 'source':'foo'},
{'name':'Dave', 'source':'egg'},
{'name':'Dave', 'source':'egg'},
{'name':'Dave', 'source':'egg'},
{'name':'Dave', 'source':'egg'},
{'name':'Dave', 'source':'egg'},
{'name':'Dave', 'source':'egg'},
{'name':'Dave', 'source':'egg'}
]
Run Code Online (Sandbox Code Playgroud)

我如何实现以下输出?

{'Gill': {'foo':3, 'bar':5}, 'Dave': {'foo':4, 'egg':7}}

我认为这可能是1班轮...

Mos*_*oye 7

使用itertools.groupby由名称,然后collections.Counter计数属于每个名字的来源类别:

from collections import Counter
from itertools import groupby

f = lambda x: x['name']
dct = {k: Counter(d['source'] for d in g) for k, g in groupby(data, f)}
print(dct)
# {'Gill': Counter({'bar': 5, 'foo': 3}), 'Dave': Counter({'egg': 7, 'foo': 4})}
Run Code Online (Sandbox Code Playgroud)

  • 当然,这假设数据按“名称”键排序。 (2认同)