Pythonのreduceを理解する:「複数の要素を1つにまとめる」って、そういうことか!

Python Beginner
Python Beginner

Python を触っていると、関数型っぽい書き方に憧れることがあります。mapfilter はよく使うけど、reduce はちょっととっつきにくい… でも、ある一言を聞いたとき、私はスッと理解できました。

「リストなどの複数の要素を“ひとつの値”にまとめたいとき」

reduce 減らすというイメージがあり、、、ひっかかっていましたが、要素が減ってまとまってるのを見ると、確かに減ってんな!って思うようになりました。

(この記事は広告を含みます。)


reduce ってなんだ?

reducefunctools モジュールにある関数で、複数の要素を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 を思い出してみてください。