
Python を触っていると、関数型っぽい書き方に憧れることがあります。map や filter はよく使うけど、reduce はちょっととっつきにくい…
でも、ある一言を聞いたとき、私はスッと理解できました。
「リストなどの複数の要素を“ひとつの値”にまとめたいとき」
reduce 減らすというイメージがあり、、、ひっかかっていましたが、要素が減ってまとまってるのを見ると、確かに減ってんな!って思うようになりました。
(この記事は広告を含みます。)
reduce ってなんだ?
reduce は functools モジュールにある関数で、複数の要素を1つの値に“畳み込む”ような処理を行います。
from functools import reduce
構文はこんな感じ:
reduce(function, iterable[, initializer])
function: 2つの引数を取る関数(前の結果と次の要素を受け取る)iterable: リストやタプルなどの繰り返し可能なオブジェクトinitializer(省略可): 最初の値。省略すると最初の2つの要素でfunctionが呼ばれます。
実際の使いどころ
では、どんな場面で使えるのか?例をいくつか紹介します。
1. スコアの合計を出す(定番!)
from functools import reduce scores = [85, 90, 78, 92] total = reduce(lambda x, y: x + y, scores) print(total) # 出力: 345
内部的にはこんな流れ:
(((85 + 90) + 78) + 92)
2. 最大・最小を探す
# 最大値 max_score = reduce(lambda x, y: x if x > y else y, scores) # 最小値 min_score = reduce(lambda x, y: x if x < y else y, scores) print(f"最大値: {max_score}, 最小値: {min_score}") # 最大値: 92, 最小値: 78
3. リストのリストを1つにまとめる(flatten)
nested = [[1, 2], [3, 4], [5, 6]] flat = reduce(lambda x, y: x + y, nested) print(flat) # [1, 2, 3, 4, 5, 6]
4. 文字列の連結やログの生成
messages = ["start", "loading...", "processing", "done"] log = reduce(lambda x, y: x + " -> " + y, messages) print(log) # start -> loading... -> processing -> done
5. 辞書のリストから値を集計する
data = [
{"name": "Alice", "score": 88},
{"name": "Bob", "score": 75},
{"name": "Charlie", "score": 92},
]
total_score = reduce(lambda acc, item: acc + item["score"], data, 0)
print(total_score) # 出力: 255
for 文で書いたほうが読みやすいときもある
正直、こういう処理は for 文でも書けますし、読みやすい場合も多いです。
でも、「この処理、複数の要素を1個にまとめてるだけ」って分かってるときには、reduce を使うとコードが短くてスッキリします。
まとめ
reduce の使いどころをひとことで言うなら、これです。
「リストなどの複数の要素を“ひとつの値”にまとめたいとき」
この感覚さえつかめば、reduce も怖くありません。
もし今、何かの処理で「このリスト、最後にひとつの結果にしたいだけなんだけどな…」と思ったら、reduce を思い出してみてください。


