これは、いくつかのlist および dict 内包表記を使用してかなり簡単に実行できます。
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 内包表記を使用して必要なデータを作成し、アイテムの値を合計してグループに割り当てます。
これは、2 つ以上のタイプに拡張できる柔軟なソリューションです。