Python での Reduce 組み込み関数の使用ガイド

WBOY
リリース: 2016-06-16 08:42:16
オリジナル
1139 人が閲覧しました

公式説明:

Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned. Roughly equivalent to:

ログイン後にコピー

それは次のことを意味します: 反復可能オブジェクトを 2 つのパラメーターを持つメソッドに適用します。これを appFun と呼び、反復可能オブジェクトを走査し、その中の要素を appFun のパラメーターとして順番に使用します。ただし、この関数には 2 つのパラメーターがあります。パラメータが使用されていますか?このようなルールがあります。以下の Reduce メソッドの実装を見てください。最初のパラメータは前述の appFun で、2 番目のパラメータは反復可能なオブジェクトです。 reduce メソッドの呼び出し時に初期化パラメーターが指定されている場合、このパラメーター値は appFun が初めて呼び出されるときに最初のパラメーターとして使用され、反復可能オブジェクトの要素が appFun の 2 番目のパラメーターとして使用されます。 reduce が呼び出された場合 初期化パラメータが指定されていない場合、appFun が初めて呼び出されるとき、反復可能オブジェクトの最初の要素が appFun の最初の要素として使用され、反復子は 2 番目から appFun として使用されます。最初の呼び出しを除き、appFun の 2 番目のパラメーターは appFun の戻り値です。たとえば、reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) は 1 から 5 までの合計を計算します。初期化パラメータが指定されていないため、最初に x+y が呼び出される、x =1、つまりリストの最初の要素、y=2、つまりリストの 2 番目の要素、その後返された 1+2 の結果は、x+y の 2 回目の呼び出しで x として使用されます。 、つまり前回の結果、2 番目の要素である y =2 など、結果が 1+2+3+4+5 になるまで続きます。

この観点から見ると、プログラム内でこのコードをreduce(lambda x, y: x+y, [1, 2, 3, 4, 5])と呼ぶ次のコード定義には実際には問題があります。結果は 16 で、正しい結果は 15 です。問題は、セットが 0 で始まらない場合、次のコードによると、最初の呼び出しは x=1 (最初の要素) であり、y であることです。も 1 に等しく、これは最初の要素でもあり、正しい y は 2 である必要があります。したがって、実際のreduceメソッドは以下の例とは異なるはずです。

def reduce(function, iterable, initializer=None): 
  it = iter(iterable) 
  if initializer is None: 
    try: 
      initializer = next(it) 
    except StopIteration: 
      raise TypeError('reduce() of empty sequence with no initial value') 
  accum_value = initializer 
  for x in iterable: 
    accum_value = function(accum_value, x) 
  return accum_value 
ログイン後にコピー

では、reduce 関数はどのようなことができるのでしょうか? 次の例を参照してください。

たとえば、上記の例では、整数セットの累算が実装されています。 lst = [1,2,3,4,5] と仮定すると、累積を実装する方法は数多くあります。

最初の方法: sum 関数 を使用します。

sum(lst) 
ログイン後にコピー


2 番目のタイプ: ループメソッド。

def customer_sum(lst): 
  result = 0 
  for x in lst: 
    result+=x 
  return result 
 
#或者 
def customer_sum(lst): 
  result = 0 
  while lst: 
      temp = lst.pop(0) 
      result+=temp 
  return result 
 
if __name__=="__main__": 
  lst = [1,2,3,4,5] 
  print customer_sum(lst) 
ログイン後にコピー

3 番目のタイプ: 再帰的合計

def add(lst,result): 
  if lst: 
    temp = lst.pop(0) 
    temp+=result 
    return add(lst,temp) 
  else: 
    return result 
 
if __name__=="__main__": 
  lst = [1,2,3,4,5] 
  print add(lst,0) 
ログイン後にコピー

4 番目の方法:reduce メソッド

lst = [1,2,3,4,5] 
print reduce(lambda x,y:x+y,lst) 
#这种方式用lambda表示当做参数,因为没有提供reduce的第三个参数,所以第一次执行时x=1,y=2,第二次x=1+2,y=3,即列表的第三个元素 
 
 
#或者 
lst = [1,2,3,4,5] 
print reduce(lambda x,y:x+y,lst,0) 
#这种方式用lambda表示当做参数,因为指定了reduce的第三个参数为0,所以第一次执行时x=0,y=1,第二次x=0+1,y=2,即列表的第二个元素, 
假定指定reduce的第三个参数为100,那么第一次执行x=100,y仍然是遍历列表的元素,最后得到的结果为115 
 
 
 
#或者 
def add(x,y): 
  return x+y 
 
print reduce(add, lst) 
#与方式1相同,只不过把lambda表达式换成了自定义函数 
 
#或者 
def add(x,y): 
  return x+y 
 
print reduce(add, lst,0) 
#与方式2相同,只不过把lambda表达式换成了自定义函数 
ログイン後にコピー

別の例を示します。[1,1,2,3,2,3,3,5,6,7,7,6,5,5,5] などのシーケンス セットがある場合、すべてのキーの繰り返しをカウントします。このセットの数値では、たとえば、1 は 2 回、2 は 2 回表示されます。一般的な考え方は、辞書ストレージを使用することです。要素は辞書のキー、出現回数は辞書の値です。まだまだ方法はたくさんあります

最初のタイプ: for ループ判定

def statistics(lst): 
  dic = {} 
  for k in lst: 
    if not k in dic: 
      dic[k] = 1 
    else: 
      dic[k] +=1 
  return dic 
 
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5] 
print(statistics(lst)) 
ログイン後にコピー

2 番目の方法はより複雑で、最初に set メソッドを使用してリストから重複を削除し、次にリストの count メソッドを使用します

def statistics2(lst): 
  m = set(lst) 
  dic = {} 
  for x in m: 
    dic[x] = lst.count(x) 
 
  return dic 
 
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5] 
print statistics2(lst) 
ログイン後にコピー

3 番目の方法:reduce メソッドを使用します

def statistics(dic,k): 
  if not k in dic: 
    dic[k] = 1 
  else: 
    dic[k] +=1 
  return dic 
 
lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5] 
print reduce(statistics,lst,{})  
#提供第三个参数,第一次,初始字典为空,作为statistics的第一个参数,然后遍历lst,作为第二个参数,然后将返回的字典集合作为下一次的第一个参数 
 
或者 
d = {} 
d.extend(lst) 
print reduce(statistics,d) 
#不提供第三个参数,但是要在保证集合的第一个元素是一个字典对象,作为statistics的第一个参数,遍历集合依次作为第二个参数 
ログイン後にコピー
上記の例を通じて、集合を操作する必要があり、統計的な結果が得られ、ループまたは再帰によって解決できる問題は、通常、reduce によって実装できることがわかりました。

reduce関数はまさに「良き仲間」です!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!