logo

Pythonのreduce()

Python では、reduce() は、指定された関数を反復可能要素に適用し、要素を 1 つの値に減らす組み込み関数です。

reduce() の構文は次のとおりです。

 functools.reduce(function, iterable[, initializer]) 
  • 関数の引数 は 2 つの引数を受け取り、1 つの値を返す関数です。最初の引数は累積された値で、2 番目の引数は反復可能な値からの現在の値です。
  • 反復可能な 引数は、削減される値のシーケンスです。
  • オプションの初期化引数は、累積結果の初期値を提供するために使用されます。初期化子が指定されていない場合は、反復可能オブジェクトの最初の要素が初期値として使用されます。

以下は、reduce() を使用して数値リストの合計を求める方法を示す例です。

 # Examples to understand the reduce() function from functools import reduce # Function that returns the sum of two numbers def add(a, b): return a + b # Our Iterable num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # add function is passed as the first argument, and num_list is passed as the second argument sum = reduce(add, num_list) print(f'Sum of the integers of num_list : {sum}') # Passing 10 as an initial value sum = reduce(add, num_list, 10) print(f'Sum of the integers of num_list with initial value 10 : {sum}') 

出力:

 Sum of the integers of num_list : 55 Sum of the integers of num_list with initial value 10 : 65 

この例では、reduce() 関数を使用して、数値リスト内の要素の各ペアに 2 つの値の合計を返す add 関数を適用し、結果としてすべての要素の合計を求めます。

二分木と二分探索木

ラムダ関数を、reduce() 関数の最初の引数として使用してみましょう。

 # Importing reduce function from functools from functools import reduce # Creating a list my_list = [1, 2, 3, 4, 5] # Calculating the product of the numbers in my_list # using reduce and lambda functions together product = reduce(lambda x, y: x * y, my_list) # Printing output print(f'Product = {product}') # Output : Product = 120 

仕組みを詳しく見てみましょう 減らす() この関数は、次の例で動作します。

reduce() 関数は、関数と反復可能引数の 2 つの引数を取ります。この場合、関数としてラムダ関数 lambda x, y: x * y を使用し、反復可能として数値リストを使用します。

  • ラムダ関数は変数 x と y を受け取り、それらを乗算して結果を返します。ラムダ関数が最初に実行されるとき、変数 x と y は、それぞれ my_list の最初と 2 番目の要素に設定されます (つまり、x = 1 と y = 2)。ラムダ関数は、これら 2 つの数値を乗算し、結果 (1 * 2 = 2) を返します。
  • ラムダ関数が 2 回目に呼び出されるとき、x は前回の呼び出しの結果 (x = 2) に設定され、y は数値リストの 3 番目の要素 (つまり、y = 3) に設定されます。これら 2 つの値を乗算し、結果 (2 * 3 = 6) を返します。
  • すべての要素が処理されるまで、my_list 内の各要素に対してラムダ関数がこの方法で繰り返し呼び出されます。 reduce() 関数はリストのすべての要素の積を返し、それが 120 として product 変数に割り当てられます。この積は次のように計算されます: ((((1 * 2) * 3)* 4)* 5) = 120.
  • 最後に、print() 関数を使用して product 変数の値を出力します。出力は 120 です。

演算子関数を使用したreduce()関数

ラムダ関数の代わりに演算子関数を使用すると、コードをより簡潔で読みやすくすることができます。

以下は、reduce 関数の最初の引数として演算子関数を使用する例を示しています。

 # Python program to demonstrate # how to use operator functions with reduce function # Importing reduce function from functools import reduce # Importing operator import operator # Creating lists my_list1 = [1, 2, 3, 4, 5] my_list2 = ['I', 'Love', 'Javatpoint'] # Calculating the sum of the numbers of my_list1 # using reduce and operator.add sum = reduce(operator.add, my_list1) # Calculating the product of the numbers of my_list1 # using reduce and operator.mul product = reduce(operator.mul, my_list1) # Concatenating all the elements in my_list2 # using reduce and operator.concat concated_str1 = reduce(operator.concat, my_list2) # We can achieve the same output by using operator.add concated_str2 = reduce(operator.add, my_list2) # Printing result print(f'Sum of all elements in my_list1 : {sum}') print(f'Product of all elements in my_list1 : {product}') print(f'Concatenated string by using operator.concat : {concated_str1}') print(f'Concatenated string by using operator.add : {concated_str2}') 

出力:

 Sum of all elements in my_list1 : 15 Product of all elements in my_list1 : 120 Concatenated string by using operator.concat : ILoveJavatpoint Concatenated string by using operator.add : ILoveJavatpoint 

このコードは、reduce() 関数と演算子関数を使用して、Python のイテラブルに対して数学演算と文字列演算を実行する方法を示します。

reduce() 関数とaccumulate() 関数の違いを理解します。

Python functools モジュールには関数reduce() とaccumulate() が用意されており、どちらも同等の方法で反復可能オブジェクトを操作します。

  1. 減らす () そして 蓄積する () 関数は、どちらも 2 つの引数 (反復可能自体と、反復可能オブジェクトに対して実行される操作を記述する関数) を受け入れるという点で似ています。ただし、作戦の結果を処理する方法が、互いに最も異なる点です。
  2. 減らす () 関数は、結果と次の要素に対して同じ操作を実行する前に、反復可能オブジェクトの最初の 2 つの要素に対して操作を実行します。このプロセスは、反復可能要素のすべてが処理されるまで繰り返されます。操作の最終出力は 1 つの結果として返されます。
  3. 一方、 蓄積する () 関数は、結果と後続の要素に対して同じ演算を実行する前に、反復可能オブジェクトの最初の 2 つの要素にも演算を適用します。accumulate() 関数は、演算の中間結果を含む反復子を返します。つまり、各要素が処理された後、 蓄積する () 関数は、操作の結果を表す一連の値を提供します。

Capsule() と Reduce() の違いを理解するための例:

 # Python Program to demonstrate the difference # between reduce and accumulate # Importing reduce and accumulate function from functools import reduce, accumulate # Creating a list my_list = [1, 2, 3, 4, 5] # Using reduce() to calculate the product of all numbers product = reduce(lambda x, y: x * y, my_list) print(f'Product using reduce() : {product}') # Output: 120 # Using accumulate() to calculate the product of all numbers products = list(accumulate(my_list, lambda x, y: x * y)) print(f'Products using accumulate() : {products}')# Output: [1, 2, 6, 24, 120] 

この例では、数値 [1、2、3、4、5] のリストがあります。を使用しております 減らす() すべての数値の積を計算すると、単一の値 120 が返されます。

私たちも使っています 蓄積() すべての数値の積を計算します。ただし、単一の値を返すのではなく、 蓄積() 中間結果のシーケンス [1, 2, 6, 24, 120] を生成する反復子を返します。

したがって、次の主な違いは、 減らす() そして、accumulate() は、reduce() が操作の最終出力である単一の値を返すことです。対照的に、accumulate() は、一連の中間結果を生成する反復子を返します。