我正在寻找一种pythonic / Elegant方式将我的dict列表(例如LD
)转换为dict的聚合列表(例如DD
)。 LD
中的词典以id
,result
和count
作为键,并且可以存在多个具有相同id
且具有不同result
的词典}秒。生成的字典DD
应该将id
聚合在一起,并将所有result
一起显示在results
中。
以下是一个例子:
LD = [
{'id':1, 'result': 'passed', 'count': 10},
{'id':1, 'result': 'failed', 'count': 20},
{'id':2, 'result': 'failed', 'count': 100}
]
这是我想要的输出
DD = [
{'id':1, 'results': {'passed': 10, 'failed': 20}},
{'id':2, 'results': {'passed': 10}}
]
我可以创建一个for循环和一个输出dict来处理LD
中的每个项目,但我想知道这是否可以使用zip
之类的东西在单行中实现。
提前致谢!
答案 0 :(得分:1)
您可以使用itertools.groupby
:
import itertools
LD = [
{'id':1, 'result': 'passed', 'count': 10},
{'id':1, 'result': 'failed', 'count': 20},
{'id':2, 'result': 'failed', 'count': 100}
]
new_result = [(a, list(b)) for a, b in itertools.groupby(sorted(LD, key=lambda x:x['id']), key=lambda x:x['id'])]
last_result = [{**{'id':a}, **{'results':{i['result']:i['count'] for i in b}}} for a, b in new_result]
输出:
[{'id': 1, 'results': {'failed': 20, 'passed': 10}}, {'id': 2, 'results': {'failed': 100}}]
编辑:Python2版本:
new_result = [(a, list(b)) for a, b in itertools.groupby(sorted(LD, key=lambda x:x['id']), key=lambda x:x['id'])]
last_result = [dict([('id', a)]+[('results', {i['result']:i['count'] for i in b})]) for a, b in new_result]
输出:
[{'id': 1, 'results': {'failed': 20, 'passed': 10}}, {'id': 2, 'results': {'failed': 100}}]
答案 1 :(得分:1)
这是collections.defaultdict
的解决方案,它不依赖于排序+ groupby。
from collections import defaultdict
d = defaultdict(lambda: defaultdict(int))
for i in LD:
d[i['id']][i['result']] += i['count']
res = [{'id': k, 'result': dict(v)} for k, v in d.items()]
# [{'id': 1, 'result': {'failed': 20, 'passed': 10}},
# {'id': 2, 'result': {'failed': 100}}]