『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

itertools.accumulate()

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]

コメント

  1. あとりえこばと より:

    ChatGPTにitertools.accumulateの使い方を説明してもらいました

    生徒:先生、itertools.accumulateって何ですか?使い方を教えてください。

    先生:いいですよ、itertools.accumulateはPythonのイテレータ操作を行うためのモジュールです。このモジュールは、与えられたイテラブル(リストやタプルなど)の要素を順番に加算(accumulate)していくことができます。

    生徒:なるほど、具体的な使い方を教えていただけますか?

    先生:もちろんです。まず、itertoolsモジュールをインポートします。そして、accumulate関数を使用します。accumulate関数には、1つの引数としてイテラブルなオブジェクトを渡します。それに対して、要素の加算が行われた新たなイテレータが返されます。

    生徒:加算される要素はどのように決まるのですか?

    先生:accumulate関数は、デフォルトでは要素同士の加算が行われます。つまり、各要素はそれまでの要素の合計となります。例えば、[1, 2, 3, 4, 5]というリストをaccumulate関数に渡すと、[1, 3, 6, 10, 15]という新たなイテレータが生成されます。

    生徒:なるほど、それ以外の演算もできるのですか?

    先生:はい、accumulate関数には第2引数として関数を渡すことができます。その関数は、要素同士の演算をカスタマイズするために使用できます。例えば、要素同士の積や文字列の結合など、任意の演算を行うことができます。

    生徒:なるほど、具体例を教えていただけますか?

    先生:もちろんです。例えば、[1, 2, 3, 4, 5]というリストをaccumulate関数に渡し、第2引数として演算子mul(乗算)を使う場合、[1, 2, 6, 24, 120]という新たなイテレータが生成されます。また、文字列の場合は結合が行われます。例えば、[‘a’, ‘b’, ‘c’, ‘d’]というリストをaccumulate関数に渡すと、[‘a’, ‘ab’, ‘abc’, ‘abcd’]という新たなイテレータが生成されます。

    生徒:なるほど、理解しました。accumulate関数はイテラブルな要素を加算(または他の演算)していく関数で、デフォルトでは要素同士の加算が行われるんですね。

    先生: その通りです。accumulate関数はイテラブルな要素を順番に加算していく機能を提供します。デフォルトでは要素同士の加算が行われますが、第2引数に演算を指定することで他の演算も行うことができます。