Pythonのfunctools.reduce()関数:リストやタプルなどの累積計算

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 = 2
  • 2 * 3 = 6
  • 6 * 4 = 24
  • 24 * 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
  • 35 を比較 → 5
  • 52 を比較 → 5
  • 58 を比較 → 8
  • 81 を比較 → 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 ループよりも効率的である場合がありますが、初心者にとっては直感的ではないかもしれません。

タグ: Python functools REDUCE lambda 累積計算

6月16日 23:30 投稿