Pythonのitertools.accumulate関数で累積和(プレフィックスサム)配列を作成する方法
Pythonでは、itertoolsモジュールに含まれるaccumulate関数を使うことで、配列(リスト)の累積和(プレフィックスサム)を簡単に計算できます。この記事では、accumulate関数の基本的な使い方と、実際のコード例をわかりやすく解説します。
itertools.accumulate関数とは
itertools.accumulate(iterable[, func])は、イテレータを返す関数です。itertoolsモジュールの各関数はすべてイテレータを構築して返すため、返り値はforループやlist()などでストリームを消費する形でアクセスする必要があります。
デフォルトの動作では、要素の合計値を順番に累積した結果を返します。扱える要素はDecimalやFractionを含む、加算可能な任意の型です。また、オプションの第2引数として2つの引数を取る関数を渡すと、加算の代わりにその関数が適用されます。
実行例
入力 data = [1, 0, 2, 3, 5] >>> list(accumulate(data)) # 累積和の計算 出力 [1, 1, 3, 6, 11]
この例では、リストの先頭から順に足し合わせた結果が得られます。つまり「1」「1+0」「1+0+2」…という具合に、各位置までの合計が順に出力されています。
アルゴリズムの手順
- リストを作成する。
list(accumulate())関数を使用し、累積合計を取得する。- 結果を表示する。
サンプルコード
# itertoolsのaccumulate関数を使って
# 累積和(プレフィックスサム)配列を出力するPythonプログラム
from itertools import accumulate
def summation(A):
print("合計後のリスト ::>", list(accumulate(A)))
# ドライバープログラム
if __name__ == "__main__":
A = list()
n = int(input("最初のリストのサイズを入力してください ::"))
print("最初のリストの要素を入力してください ::")
for i in range(int(n)):
k = int(input(""))
A.append(k)
summation(A)実行結果
最初のリストのサイズを入力してください ::5 最初のリストの要素を入力してください :: 1 2 3 4 5 合計後のリスト ::> [1, 3, 6, 10, 15]
まとめ
itertools.accumulateを使えば、ループを自分で書かずとも1行で累積和配列を求められます。コードが簡潔になるだけでなく、C言語レベルで実装されているため高速に動作する点もメリットです。部分和が必要なアルゴリズムやデータ集計処理において、ぜひ活用してみてください。
-
Pythonでリストの累積和(累積合計)を求める方法
この記事では、リストの累積和(累積合計)を求める問題の解決策について詳しく解説します。問題文あるリストが与えられたとき、各要素までの累積和を格納した新しいリストを作成する必要があります。例えば、[10, 20, 30, 40, 50] というリストが与えられた場合、出力は [10, 30, 60, 100, 150] となります。これは、各位置でそれ以前の要素をすべて足し合わせた値です。実装例それでは、実際の実装を見ていきましょう。# 累積和を求める関数 def Cumulative(l): new = [] cumsum = 0 for element in l:
-
Pythonで配列(リスト)の合計を求める方法をわかりやすく解説
この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に