python - 字典列表到字典聚合列表

标签 python python-2.7 dictionary

我正在寻找一种 pythonic/优雅的方式来将我的字典列表(例如 LD)转换为字典的聚合列表(例如 DD)。 LD中的dict以idresultcount为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/

相关文章:

python - 如何使用 XGboost 针对不同的 `eval_metric` 优化 sklearn 管道?

Python:根据前一行的最后一个元素和后一行的第一个元素之间的差异组合数组行

python - “模块”对象不能用 sqlalchemy 调用

Python键绑定(bind)/捕获

python-2.7 - 来自 AWS Lambda 函数的独立 python 子进程

Python:如何使相同类型的可比较的可哈希对象被 set/dict 视为单个对象?

python - pygame中的图像碰撞

python-2.7 - Python - 列表中重复项的索引

c++ - 在 C++ 中的 3D map 中插入值

Java:如何以原子方式替换 Map 中的所有值?