我正在寻找一种 pythonic/优雅的方式来将我的字典列表(例如 LD
)转换为字典的聚合列表(例如 DD
)。 LD
中的dict以id
、result
、count
为key,可以有多个dict相同的 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 循环和一个输出字典来处理 LD
中的每个项目,但我想知道这是否可以使用 zip
之类的东西在单行代码中实现> 等
提前致谢!
最佳答案
你可以使用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}}]
关于python - 字典列表到字典聚合列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49305946/