【functools】reduce関数を使ってリスト内の全要素の計算値を取得する方法[Python]

  • URLをコピーしました!
目次

functools

前回、自作関数を使ってリストや辞書から条件を満たす要素を抽出するfilter関数を紹介しました。

今回はfunctoolsのreduce関数を使ってリスト内の全要素の計算値を取得する方法を紹介します。

ここでいう計算値というのは全要素を足し算したり、引き算するといった一定の計算をリストの前から順番に行なっていくと得られる値のことです。

例えばリスト内の全要素を足し算する場合、reduce関数を使わず、for文で計算をするとこんな感じになります。

a_list = [1, 2, 3, 4, 5]

add_val = 0
for a_val in a_list:
    add_val = add_val + a_val

print(add_val)

実行結果
15

今回はこういった計算をreduce関数を使っておこなってみます。

それでははじめていきましょう。

reduce関数

reduce関数を使うには「functools」の「reduce」をインポートします。

from functools import reduce

そして使い方は「reduce(自作関数, リスト)」です。

ここで自作関数が計算部分の関数で、要するに計算式を別途用意して、そこにリストの値を順次入れて計算して行くというわけです。

例えば足し算をするための自作関数はこんな感じになります。

def add_calc(a, b):
    return a + b

この自作関数を使って、reduce関数でリストの要素を全部足し算するにはこんな感じです。

from functools import reduce

a_list = [1, 2, 3, 4, 5]

def add_calc(a, b):
    return a + b

add_val = reduce(add_calc, a_list)

print(add_val)

実行結果
15

注意すべき点は自作関数の引数は2つで、3つ以上ではエラーとなります。

from functools import reduce

a_list = [1, 2, 3, 4, 5]

def add_calc(a, b, c):
    return a + b + c

add_val = reduce(add_calc, a_list)

print(add_val)

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[3], line 8
      5 def add_calc(a, b, c):
      6     return a + b + c
----> 8 add_val = reduce(add_calc, a_list)
     10 print(add_val)

TypeError: add_calc() missing 1 required positional argument: 'c'

reduce関数の性質上、1回目は「リストの最初の要素」と「リストの2つ目の要素」を計算します。

次に「最初の要素と2つ目の要素の計算結果」と「3つ目の要素」を使って計算を行うということなので、引数は2つまでということなのでしょう。

こうなると結構簡単な計算で使いやすそうですが、その場合、自作関数としてlambda式を用いることも可能です。

from functools import reduce

a_list = [1, 2, 3, 4, 5]

add_val = reduce(lambda a, b: a + b, a_list)

print(add_val)

実行結果
15

次回はitertoolsの無限イテレータcount、cycle、repeatを紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次