あるリストをグルーピングするのに、便利な標準ライブラリ itertools の groupby
これを使用するには、事前に対象をグルーピングするキーでソートしてしておかなければならない。
from functools import reduce from itertools import groupby users = [ { "key": "A", "value": 15 }, { "key": "C", "value": 32 }, { "key": "B", "value": 24 }, { "key": "A", "value": 12 }, { "key": "C", "value": 35 }, { "key": "B", "value": 22 }, { "key": "A", "value": 17 } ] # 事前にソートする users.sort(key=lambda u:u['key']) # key でグルーピング for key, group in groupby(users, key=lambda e:e['key']): print('key = %s' % key) for user in group: print(user) # key = A # {'key': 'A', 'value': 15} # {'key': 'A', 'value': 12} # {'key': 'A', 'value': 17} # key = B # {'key': 'B', 'value': 24} # {'key': 'B', 'value': 22} # key = C # {'key': 'C', 'value': 32} # {'key': 'C', 'value': 35}
for key, group in groupby(users, key=lambda e:e['key']): sumvalue = sum([ u['value'] for u in group]) print('key = %s sum = %s' % (key, sumvalue)) # key = A sum = 44 # key = B sum = 46 # key = C sum = 67