itertools.accumulate()

itertools.accumulate()

itertools.accumulate()

 itertools.accumulate() は 2 変数関数による累積結果を イテレータ で返します。

 itertools.accumulate(iterable[, func])

 第 1 引数に渡した iterable の要素を
 

p0, p1, p2, p3, ...

とすると、itertools.accumulate(iterable, func) は
 

p0, func(p0, p1), func((p0, p1), p2), ...

を返します。いくつかのサンプルコードで動作を確認してみましょう。

加算累積イテレータ

 最初に itertoolsモジュールから accumulate() を、operatorモジュールから関数形式の演算子 add() と mul() を読み込んでおきます。

# リストA-1

# itertoolsモジュールからaccumulate()をインポート
from itertools import accumulate

# operatorモジュールから関数形式の標準演算子をインポート
from operator import add, mul

 func に operator.add を渡して、加算累積イテレータを生成します。

# リストA-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 を渡すと、乗算累積イテレータを生成します。

# リストA-3

# リストを定義
a = [1, 2, 3, 4, 5]

# 累積イテレータを生成
b = accumulate(a, mul)

# イテレータの要素をすべて表示
print(list(b))
[1, 2, 6, 24, 120]

 

max累積イテレータ

 func に組み込み関数 max() を渡すこともできます。

# リストA-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, 86), max(68, 51), max(68, 34), max(68, 83)

という要素をもつ累積イテレータを生成します。
 

lambda式による累積イテレータの生成

 func に lambda 式 を渡すこともできます。

# リストA-5

# リストを定義
a = [10, 20, 30, 40, 50]

# 累積イテレータを生成
b = accumulate(a, lambda x, y : x + y)

# イテレータの要素をすべて表示
print(list(b))
[10, 30, 60, 100, 150]