这可以使用一些list 和 dict comprehensions相当容易地完成。
from operator import itemgetter
from itertools import groupby
l = [{"num1": 3, "num2": 8, "num3": 5, "type": "A"},
{"num1": 2, "num2": 5, "num3": 5, "type": "B"},
{"num1": 5, "num2": 2, "num3": 1, "type": "A"},
{"num1": 4, "num2": 4, "num3": 9, "type": "B"}]
wanted_values = {"num1", "num2", "num3"}
type_getter = itemgetter("type")
groups = [(group, list(items)) for group, items in
groupby(sorted(l, key=type_getter), type_getter)]
print({group: {k: sum(map(itemgetter(k), items)) for k in wanted_values}
for group, items in groups})
这给了我们:
{'B': {'num2': 9, 'num3': 14, 'num1': 6},
'A': {'num2': 10, 'num3': 6, 'num1': 8}}
我们按类型对值进行排序,然后将它们分成组itertools.groupby()
(制作项目列表而不是生成器,因为我们需要多次迭代它们)。
然后,我们使用嵌套的 dict 理解来创建我们需要的数据,将项目中的值相加并将它们分配给一个组。
这是一个灵活的解决方案,可以扩展到不止两种类型。