我正在寻找一种pythonic/优雅的方法来将我的dict列表(例如LD)转换为一个dict的聚合列表(例如DD)。LD中的dict以id、result和count作为键,可以有多个具有不同result的id的dict,生成的dict 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之类的东西在一行中实现。
提前感谢!
发布于 2018-03-15 17:50:22
您可以使用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}}]发布于 2018-03-15 18:29:25
这是一个通过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}}]https://stackoverflow.com/questions/49305946
复制相似问题