functools
前回、functoolsで特定の関数の一部の引数を固定した新しい関数を作る方法(functools.partial)を紹介しました。
今回はitertoolsでリストの値の累積和や他の累積計算値を取得する関数accumulateを紹介します。
それでは始めていきましょう。
accumulateの使い方
accumulateはitertoolsのaccumulateをインポートして、「accumulate(累積和を計算したいリスト)」として使用します。
またイテレータなので、そのままprintしても値は得られないので、アンパックして値を取得します。
from itertools import accumulate
val_list = [1, 2, 3, 4, 5]
print(*accumulate(val_list))
実行結果
1 3 6 10 15
またfor文で一つ一つ取得してもいいです。
from itertools import accumulate
val_list = [1, 2, 3, 4, 5]
for val in accumulate(val_list):
print(val)
実行結果
1
3
6
10
15
ただしイテレータであるため、値は1回ずつしか取得できないので注意してください。
詳細はこちらの記事でどうぞ。
ちなみにアンパックせずにprintするとこうなります。
from itertools import accumulate
val_list = [1, 2, 3, 4, 5]
print(accumulate(val_list))
実行結果
<itertools.accumulate object at 0x10908c540>
他の累積計算値を取得する方法
accumulateはデフォルトでは累積和を取得しますが、第2引数に計算式の関数を指定するとその計算の累積計算値を取得することができます。
例えば組み込み関数であるmaxやminを第2引数に指定すると、リストの前から要素をチェックしていき、その時点での最大値や最小値を取得することができます。
from itertools import accumulate
val_list = [1, 2, 3, 4, 5, 4, 3, 2, 1]
print(*accumulate(val_list, max))
実行結果
1 2 3 4 5 5 5 5 5
from itertools import accumulate
val_list = [5, 4, 3, 2, 1, 2, 3, 4, 5]
print(*accumulate(val_list, min))
実行結果
5 4 3 2 1 1 1 1 1
累積積を得るためには「operatorモジュール」をインポートして、「operator.mul」をaccumulateの第2引数に指定します。
from itertools import accumulate
import operator
val_list = [5, 4, 3, 2, 1, 2, 3, 4, 5]
print(*accumulate(val_list, operator.mul))
実行結果
5 20 60 120 120 240 720 2880 14400
まだaccumulateの第2引数には自作関数を指定することも可能です。
例えば累積の割り算はこんな感じで計算することができます。
from itertools import accumulate
val_list = [5, 4, 3, 2, 1, 2, 3, 4, 5]
def divide(a, b):
return a/b
print(*accumulate(val_list, divide))
実行結果
5 1.25 0.4166666666666667 0.20833333333333334
0.20833333333333334 0.10416666666666667 0.034722222222222224
0.008680555555555556 0.0017361111111111112
初期値の設定
ここまではリストの前の要素から順々に計算していました。
accumulateにはもう一つ「initial」という引数があり、これを設定することで初期値を指定することができます。
from itertools import accumulate
val_list = [1, 2, 3, 4, 5]
print(*accumulate(val_list, initial=100))
実行結果
100 101 103 106 110 115
上記の実行結果では、初期値「100」、それにリストの最初の要素1を足して「101」、次に2つ目の要素を足して「103」という計算が行われ、それぞれの結果となっています。
これを利用すると年利計算ができたりします。
例えば初期投資1000円で年利10%で10年保有したという計算の場合はこんな感じになります。
from itertools import accumulate,repeat
def interest_calc(initial, interest):
return round(initial*(1+interest/100), 2)
print(*accumulate(repeat(10, 10), interest_calc, initial=1000))
実行結果
1000 1100.0 1210.0 1331.0 1464.1 1610.51 1771.56 1948.72 2143.59
2357.95 2593.74
ということでなかなか便利そうなaccumulate関数です。
次回は同じくitertoolsから文字列のイテレータであるchain、compress、islice、pairwise、zip_longestを一気に紹介します。
ではでは今回はこんな感じで。
コメント