1. 程式人生 > 其它 >python中itertools模組中的accumulate函式(計算字首和)

python中itertools模組中的accumulate函式(計算字首和)

技術標籤:python3

很多時候我們會遇到需要計算字首和的情況,python為我們提供了一個計算字首和的函式(這個函式除了計算字首和之外還可以處理其他的情況):itertools.accumulate(iterable[, func, *, initial=None]),函式中的引數有三個,第一個引數為傳遞的迭代器引數,第二個引數為func函式,可以為max、min或者是operator.mul(),第三個引數是一開始計算的引數,下面是python官方文件的相關介紹:
accumulate函式建立一個迭代器,返回累積彙總值或其他雙目運算函式的累積結果值(通過可選的 func 引數指定)。如果提供了 func,它應當為帶有兩個引數的函式。 輸入 iterable 的元素可以是能被 func 接受為引數的任意型別。(例如,對於預設的加法運算,元素可以是任何可相加的型別包括 Decimal 或 Fraction。)通常,輸出的元素數量與輸入的可迭代物件是一致的。 但是,如果提供了關鍵字引數 initial,則累加會以 initial 值開始,這樣輸出就比輸入的可迭代物件多一個元素。func 引數有幾種用法。它可以被設為 min() 最終得到一個最小值,或者設為 max() 最終得到一個最大值,或設為 operator.mul() 最終得到一個乘積。攤銷表可通過累加利息和支付款項得到。給iterable設定初始值並只將引數 func 設為累加總數可以對一階遞迴關係建模。

python3.8的官方文件的描述:https://docs.python.org/zh-cn/3.8/library/itertools.html#itertools.accumulate

下面是具體的例子,因為函式的返回值是一個迭代器,所以可以使用list函式將其轉換為list列表進行輸出,這樣就可以輸出具體的結果方便檢視或者是做進一步的處理:

import itertools
import operator

if __name__ == '__main__':
    data = [1, 2, 3, 4, 5]
    # 計算字首和
    print(list(itertools.accumulate(data)))
    # 計算到當前位置累積相乘得結果
    data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
    print(list(itertools.accumulate(data, operator.mul, initial=2)))
    # 計算到當前位置的最大值並且輸出
    print(list(itertools.accumulate(data, max)))