Python reduce() 関数
reduce() は Python の functools モジュールに含まれる関数で、リストやタプルなどの シーケンス に対して 累積計算 を行い、シーケンスを単一の値に簡約します。
1. reduce() の基本的な構文
from functools import reduce
reduce(関数, 反復可能オブジェクト[, 初期値])
引数の説明
関数:反復可能オブジェクトの要素に対して累積計算を行うための2つの引数を受け取る関数。反復可能オブジェクト:リスト、タプルなど、反復可能なオブジェクト。初期値(オプション):初期値を設定する場合に使用。初期値が指定された場合、最初の呼び出しではこの値が関数の第一引数となります。
2. reduce() の基本的な使用方法
2.1 リストの合計
from functools import reduce
# 合計を計算する関数を定義
def add(a, b):
return a + b
# `reduce`を使用して累積合計を計算
result = reduce(add, [1, 2, 3, 4, 5])
print(result) # 出力: 15
説明
- 最初の計算:
1 + 2 = 3 - 二回目の計算:
3 + 3 = 6 - 三回目の計算:
6 + 4 = 10 - 四回目の計算:
10 + 5 = 15
2.2 lambda 式を使用
from functools import reduce
# `lambda`式を使用して合計を計算
result = reduce(lambda a, b: a + b, [1, 2, 3, 4, 5])
print(result) # 出力: 15
2.3 リストの要素の積
from functools import reduce
# リストのすべての要素の積を計算
result = reduce(lambda a, b: a * b, [1, 2, 3, 4, 5])
print(result) # 出力: 120
1 * 2 = 22 * 3 = 66 * 4 = 2424 * 5 = 120
3. reduce() の高度な使用方法
3.1 初期値の設定
from functools import reduce
# 初期値を使用して合計を計算
result = reduce(lambda a, b: a + b, [1, 2, 3, 4, 5], 10)
print(result) # 出力: 25
initializer=10つまり10 + 1 + 2 + 3 + 4 + 5 = 25
3.2 リスト内の最大値を見つける
from functools import reduce
# 最大値を計算
result = reduce(lambda a, b: a if a > b else b, [3, 5, 2, 8, 1])
print(result) # 出力: 8
3と5を比較 → 55と2を比較 → 55と8を比較 → 88と1を比較 → 8
3.3 文字列の連結
from functools import reduce
words = ["Python", "is", "awesome"]
result = reduce(lambda a, b: a + " " + b, words)
print(result) # 出力: Python is awesome
3.4 階乗の計算
from functools import reduce
n = 5
factorial = reduce(lambda a, b: a * b, range(1, n + 1))
print(factorial) # 出力: 120
5! = 1 * 2 * 3 * 4 * 5 = 120
4. reduce() と for ループの比較
reduce() は累積計算を行う際に、明示的な for ループの代わりに使用できます。
4.1 for ループでリストの合計を計算
nums = [1, 2, 3, 4, 5]
total = 0
for num in nums:
total += num
print(total) # 出力: 15
4.2 reduce() を使用
from functools import reduce
result = reduce(lambda a, b: a + b, [1, 2, 3, 4, 5])
print(result) # 出力: 15
reduce()は より簡潔 で、明示的なループが不要です。
5. reduce() の一般的な使用例
- 合計 / 積
from functools import reduce
nums = [1, 2, 3, 4, 5]
sum_result = reduce(lambda a, b: a + b, nums)
prod_result = reduce(lambda a, b: a * b, nums)
print(sum_result) # 15
print(prod_result) # 120
- 最大/最小値
from functools import reduce
nums = [5, 12, 8, 3, 15]
max_value = reduce(lambda a, b: a if a > b else b, nums)
min_value = reduce(lambda a, b: a if a < b else b, nums)
print(max_value) # 15
print(min_value) # 3
- 文字列の連結
from functools import reduce
words = ["Hello", "World", "from", "Python"]
sentence = reduce(lambda a, b: a + " " + b, words)
print(sentence) # Hello World from Python
- 階乗の計算
from functools import reduce
n = 5
factorial = reduce(lambda a, b: a * b, range(1, n + 1))
print(factorial) # 120
6. reduce() と他の関数の比較
| 特性 | reduce() |
map() |
filter() |
|---|---|---|---|
| **機能** | 累積計算 | マッピング変換 | フィルタリング |
| **戻り値** | 単一の値 | 新しい反復可能オブジェクト | 新しい反復可能オブジェクト |
| **使用シーン** | 合計、積、最大/最小値の計算 | シーケンスの要素に対する操作 | 条件に一致する要素のフィルタリング |
| **インポートが必要か** | 必要 (functools) |
不要 | 不要 |
7. 注意点
reduce()はfrom functools import reduceが必要です。reduce()は シーケンスの累積計算 に適していますが、単純な合計や積の計算にはsum()やprod()などの組み込み関数を使用することをお勧めします。- 大規模データの処理では
reduce()がforループよりも効率的である場合がありますが、初心者にとっては直感的ではないかもしれません。