itertools の groupby

あるリストをグルーピングするのに、便利な標準ライブラリ 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