Pythonの累積イテレータ
Python の itertools.accumulate() は二項関数による累積結果を イテレータ で返します。
itertools.accumulate(iterable[, func])
第 1 引数に渡した iterable の要素を p0, p1, p2, p3, … とすると、itertools.accumulate(iterable, func) は
p0, func(p0, p1), func(func(p0, p1), p2), …
を返します。いくつかのサンプルコードで動作を確認してみましょう。
最初に itertoolsモジュールから accumulate() を、operatorモジュールから関数形式の演算子 add() と mul() を読み込んでおきます。
# PYTHON_ACCUMULATE # In[1] # itertoolsモジュールからaccumulate()をインポート from itertools import accumulate # operatorモジュールから関数形式の標準演算子をインポート from operator import add, mul
func に operator.add を渡して、加算累積イテレータ を生成します。
# In[2] # リストを定義 a = [1, 2, 3, 4, 5] # 加算累積イテレータを生成 b = accumulate(a, add) # イテレータの要素をすべて表示 print(list(b)) # [1, 3, 6, 10, 15]
上のコードでは、accumulate(a, add) によって
1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5
という要素をもつイテレータを変数 b に格納しています。
itertools.accumulate() の第 2 引数 func には他にも色々な関数オブジェクトを渡せます。たとえば、func に operator.mul を渡すと、乗算累積イテレータ を生成します。
# In[3] # リストを定義 a = [1, 2, 3, 4, 5] # 乗算累積イテレータを生成 b = accumulate(a, mul) # イテレータの要素をすべて表示 print(list(b)) # [1, 2, 6, 24, 120]
func に組み込み関数 max() を渡すこともできます。
# In[4] # リストを定義 a = [13, 68, 51, 34, 83] # 累積イテレータを生成 b = accumulate(a, max) # イテレータの要素をすべて表示 print(list(b)) # [13, 68, 68, 68, 83]
accumulate(a, max) の最初の要素は 13 です。次に max(13, 68) で小さくないほうの値 68 を取得します。次に max(68, 51) で小さくないほうの値 68 を取得します。これを繰り返して、
13, max(13, 68), max(68, 51), max(68, 34), max(68, 83)
という要素をもつ累積イテレータを生成します。
func に lambda 式 を渡すこともできます。
# In[4] # リストを定義 a = [10, 20, 30, 40, 50] # 累積イテレータを生成 b = accumulate(a, lambda x, y : x + y) # イテレータの要素をすべて表示 print(list(b)) # [10, 30, 60, 100, 150]
コメント