reduce
このレッスンでできるようになること。functools.reduce を使って、リストを1つの値へ畳み込む集計を書けるようになります。
map は全部を変換し、filter は一部を残しました。reduce は「たくさんの値を1つにまとめる」道具です。左から順に2つずつ関数へ渡し、その結果を次の計算へ持ち回ります。標準の組み込み関数ではないので、使う前に import します。
Python
from functools import reduce
factors = [2, 3, 4]
multiply = lambda product, factor: product * factor
result = reduce(multiply, factors, 1)
print(result) # 24第1引数の関数は、ここまでの計算結果と次の要素を受け取り、新しい計算結果を返します。第3引数は初期値です。上の例では、最初に 1 と 2 を渡して 2、その結果と 3 を渡して 6、その結果と 4 を渡して 24 になります。初期値を書いておくと、リストが空でもその値がそのまま返るので安全です。初期値を省くと空リストで TypeError になります。合計を出したいなら 0、掛け算なら 1 のように、その計算で「何もしていない状態」を初期値にします。
金額リストの単純な合計なら sum のほうが速くて読みやすく、実務でもそちらを選びます。reduce が本当に効くのは、合計以外の畳み込みです。たとえば最も高い支出を選ぶ、カテゴリごとの集計辞書を1つずつ育てる、といった処理は sum では書けません。
Python
from functools import reduce
expenses = [
{"name": "牛乳", "amount": 220},
{"name": "書籍", "amount": 2035},
]
top = reduce(lambda acc, e: e if e["amount"] > acc["amount"] else acc, expenses)
print(top["name"]) # 書籍金額は int で持っておくと、何度畳み込んでも桁が揺れません。
演習では import は準備済みです。ここまでの合計と次の支出を受け取る lambda を作り、reduce にその関数、支出リスト、初期値 0 を渡して、結果を返してください。
要件
- 合計と支出1件を受け取り、金額を足した値を返す lambda を作る
- reduce にその関数、expenses、初期値 0 を渡す
- reduce の計算結果を返す
ヒント
編集 ゆめさく編集部