首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dict列表到dict聚合列表

dict列表到dict聚合列表
EN

Stack Overflow用户
提问于 2018-03-15 17:40:47
回答 2查看 106关注 0票数 4

我正在寻找一种pythonic/优雅的方法来将我的dict列表(例如LD)转换为一个dict的聚合列表(例如DD)。LD中的dict以idresultcount作为键,可以有多个具有不同resultid的dict,生成的dict DD应该将id集合在一起并显示所有result(在results中)。

下面是一个示例:

代码语言:javascript
复制
LD = [
    {'id':1, 'result': 'passed', 'count': 10},
    {'id':1, 'result': 'failed', 'count': 20},
    {'id':2, 'result': 'failed', 'count': 100}
]

这是我想要的输出

代码语言:javascript
复制
DD = [
    {'id':1, 'results': {'passed': 10, 'failed': 20}},
    {'id':2, 'results': {'passed': 10}}
] 

我可以创建一个for循环和一个输出dict来处理LD中的每个项,但我想知道这是否可以通过使用zip之类的东西在一行中实现。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-15 17:50:22

您可以使用itertools.groupby

代码语言:javascript
复制
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]

输出:

代码语言:javascript
复制
[{'id': 1, 'results': {'failed': 20, 'passed': 10}}, {'id': 2, 'results': {'failed': 100}}]

编辑: Python2版本:

代码语言:javascript
复制
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]

输出:

代码语言:javascript
复制
[{'id': 1, 'results': {'failed': 20, 'passed': 10}}, {'id': 2, 'results': {'failed': 100}}]
票数 1
EN

Stack Overflow用户

发布于 2018-03-15 18:29:25

这是一个通过collections.defaultdict提供的解决方案,它不依赖于排序+ groupby。

代码语言:javascript
复制
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}}]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49305946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档