【Python】reduce()で各要素に同じ関数を使用する!
Pythonでfunctools.reduce()を使用すると、各要素に対して同じ関数を使用することができます。
reduce()とはイテレータの各要素に対して同じ処理を行い、最終的にひとつの値として返す高階関数であり、リストやタプルなどの各要素に対して使用することができます。
そして、lamndaという無名関数と組み合わせて使用すると、演算などのような小さな処理を各要素に実行することができます。
また、reduce()によく似たaccumulate()がありますが「返す値が異なる」という違いがあります。
今回はPythonのreduce()で各要素に同じ関数を使用する方法について以下の内容で解説していきます。
⚫︎ 要素の足し算を行う場合
⚫︎ 要素の引き算を行う場合
⚫︎ 要素のかけ算を行う場合
⚫︎ 要素の最大公約数を行う場合
⚫︎ 要素の最小公倍数を行う場合
⚫︎ lambdaを使用して各要素に同じ関数を使用する方法
⚫︎ reduce()とaccumulate()との違い
目次
reduce()とは
reduce()とは、リストやタプルなどのイテレータの各要素に対して同じ処理を行い、最終的にひとつの値として返す高階関数となります。
そもそも、高階関数とは「関数を引数として受け取る関数」のことであり、リストなどの各要素に共通の処理を行いたい場合などに処理をわかりやすく書くことができます。
その為、map()関数も高階関数の一つとなります。
もmし、map()関数について詳しく知りたい場合はこちらをご参考ください。
reduce()の書き方
functools.reduce()の書き方は下記となります。
1 2 3 |
import functools functools.reduce(関数, イテレータ) |
reduce()はfunctoolsライブラリで準備されている関数になりますので、まずはfunctoolsをインポートする必要があります。
reduce()のパラメータ
⚫︎ 関数:
要素に同じ処理を繰り返したい関数を指定する
⚫︎ イテレータ:
要素を持つイテレータ(リストやタプルなど)を指定する
reduce()のパラメータに関数とイテレータを指定することでイテレータの各要素に対して指定した関数を使用することができます。
各要素に同じ関数を使用するサンプルコード
各要素に同じ関数を使用するサンプルコードを紹介します。
要素の足し算を行う場合
reduce()で要素の足し算を行ってみます。
例
1 2 3 4 5 6 7 8 |
import functools import operator list1 = [1, 3, 4, 10, 4, 45, 90, 100] print(list1) print('・reduce()で要素の足し算を行う') print('結果:', functools.reduce(operator.add, list1)) |
出力結果
[1, 3, 4, 10, 4, 45, 90, 100]
・reduce()で要素の足し算を行う
結果: 257
reduce()にパラメータにoperator.add()を指定することで要素の足し算を行っています。
その為、「1 +3 + 4 +10 + 4 + 45 + 90 + 100」で「257」が表示されています。
要素の引き算を行う場合
reduce()で要素の引き算を行ってみます。
例
1 2 3 4 5 6 7 8 9 |
import functools import operator list1 = [1, 3, 4, 10, 4, 45, 90, 100] print(list1) print('・reduce()で要素の引き算を行う') print('結果:', functools.reduce(operator.sub, list1)) |
出力結果
[1, 3, 4, 10, 4, 45, 90, 100]
・reduce()で要素の引き算を行う
結果: -255
reduce()にパラメータにoperator.sub()を指定することで要素の引き算を行っています。
その為、「1 – 3 – 4 – 10 – 4 – 45 – 90 – 100」で「-255」が表示されています。
要素のかけ算を行う場合
reduce()で要素のかけ算を行ってみます。
例
1 2 3 4 5 6 7 8 |
import functools import operator list1 = [1, 3, 4, 10, 4, 45, 90, 100] print(list1) print('・reduce()で要素の掛け算を行う') print('結果:', functools.reduce(operator.mul, list1)) |
出力結果
[1, 3, 4, 10, 4, 45, 90, 100]
・reduce()で要素の掛け算を行う
結果: 194400000
reduce()にパラメータにoperator.mul()を指定することで要素のかけ算を行っています。
その為、「1 × 3 × 4 × 10 × 4 × 45 × 90 × 100」で「194400000」が表示されています。
要素の割り算を行う場合
reduce()で要素の割り算を行ってみます。
例
1 2 3 4 5 6 7 8 |
import functools import operator list1 = [1000000, 20, 20, 20, 20, 20, 20, 10] print(list1) print('・reduce()で要素の割り算を求める') print('結果:', functools.reduce(operator.truediv, list1)) |
出力結果
[1000000, 20, 20, 20, 20, 20, 20, 10]
・reduce()で要素の割り算を求める
結果: 0.0015625
reduce()にパラメータにoperator.truediv()を指定することで要素のかけ算を行っています。
その為、「1000000 ÷ 20 ÷ 20 ÷ 20 ÷ 20 ÷ 20 ÷ 10 」で「0.0015625」が表示されています。
要素の最大公約数を求める場合
reduce()で要素の最大公約数を求めてみます。
例
1 2 3 4 5 6 7 8 |
import functools import math list1 = [1000, 3000, 4000, 2000, 4500, 6000, 9000, 100000] print(list1) print('・reduce()で要素の最大公約数を求める') print('結果:', functools.reduce(math.gcd, list1)) |
出力結果
[1000, 3000, 4000, 2000, 4500, 6000, 9000, 100000]
・reduce()で要素の最大公約数を求める
結果: 500
reduce()のパラメータにmath.gcd()を使用することで要素の最大公約数を求めています。
要素の最小公倍数を求める場合
reduce()で要素の最小公倍数を求めてみます。
例
1 2 3 4 5 6 7 8 |
import functools import math list1 = [10, 30, 40, 20, 45, 60, 15, 9] print(list1) print('・reduce()で要素の最小公倍数を求める') print('結果:', functools.reduce(math.lcm, list1)) |
出力結果
[10, 30, 40, 20, 45, 60, 15, 9]
・reduce()で要素の最小公倍数を求める
結果: 360
reduce()のパラメータにmath.lcm()を使用することで要素の最小公倍数を求めています。
lambdaを使用して各要素に同じ処理を行う方法
reduce()とlambda(無名関数)を組み合わせて使用することでも各要素に同じ処理を行うことができます。
lambdaは大きな処理は厳しいですが、演算などのような小さな処理を実装することは可能です。
もし、lambdaついて詳しく知りたい場合はこちらをご参考ください。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import functools list1 = [1000, 2, 2, 4, 5, 1] print('・lambdaを使って各要素に同じ処理を行う') result1 = functools.reduce(lambda x, y: x + y, list1) print('足し算の結果', result1) result2 = functools.reduce(lambda x, y: x - y, list1) print('引き算の結果',result2) result3 = functools.reduce(lambda x, y: x * y, list1) print('掛け算の結果',result3) result4 = functools.reduce(lambda x, y: x / y, list1) print('割り算の結果',result4) |
出力結果
[1000, 2, 2, 4, 5, 1]
・lambdaを使って各要素に同じ処理を行う
足し算の結果 1014
引き算の結果 986
掛け算の結果 80000
割り算の結果 12.5
reduce()のパラメータにlambadaを使用することで、各要素に同じ処理を行うことができます。
また、reduce()で演算を行う場合は「operatorライブラリ」をインポートする必要がありましたが、lambadaを使用するとインポートせずに要素内の演算を行うことができます。
accumulate()とreduce()との違い
Pythonではreduce()とよく似たaccumulate()というものがあります。
accumulate()は、tertoolsライブラリで準備されているリストやタプルなどの要素の累積和をイテレータで返す関数となります。
しかし、reduce()とaccumulate()には以下のような大きな違いがあります。
⚫︎ 返す値が異なる:
reduce()は処理を行った後に最終的な値を返すが、accumulate()は処理の途中の値も含めてイテレータで返す
例
1 2 3 4 5 6 7 8 9 10 |
import itertools import functools import operator print('・accumulate()とreduce()の違い') list1 = [1000000, 20, 20, 2000, 20, 20, 6000, 10] print(list1) print('・accumulate()使用後:', list(itertools.accumulate(list1))) print('・reduce()使用後:', functools.reduce(operator.add, list1)) |
出力結果
・accumulate()とreduce()の違い
[1000000, 20, 20, 2000, 20, 20, 6000, 10]
・accumulate()使用後: [1000000, 1000020, 1000040, 1002040, 1002060, 1002080, 1008080, 1008090]
・reduce()使用後: 1008090
accumulate()はリストの要素を計算した結果をイテレータとして表示していますが、reduce()はリストの要素を計算した最終結果のみを表示しています。
今回のポイント
reduce()で各要素に同じ関数を使用
Pythonで各要素に同じ関数を使用するにはfunctools.reduce()を使用する。
⚫︎ reduce()とは、リストやタプルなどのイテレータの要素に対して同じ処理を行い、最終的にひとつの値として返す高階関数である
(map()も高階関数の一つ)
⚫︎ reduce()を使用するためにはまず、functools>をインポートする必要がある
⚫︎ reduce()のパラメータには処理を行う関数とイテレータを指定する
⚫︎ accumulate()とreduce()との違いは「返す値が異なる」という点がある
(reduce()は最終的な値を返すが、accumulate()は処理の途中の値も含めてイテレータで返す)
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。