dict汇总列表的dict列表

时间:2018-03-15 17:40:48

标签: python python-2.7 dictionary

我正在寻找一种pythonic / Elegant方式将我的dict列表(例如LD)转换为dict的聚合列表(例如DD)。 LD中的词典以idresultcount作为键,并且可以存在多个具有相同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之类的东西在单行中实现。

提前致谢!

2 个答案:

答案 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}}]