假設我有在Python相同的大小,首先兩個列表:Python 2.7中內置了這個函數嗎?
[100, 200, 300, 400]
,我想對方是:
[0, 100, 300, 600]
這是在第二個列表中的每個元素等於總和之前的所有元素。
是否有一個內置的Python函數在列表中執行這樣的操作?或者我必須考慮一個算法來做到這一點?
假設我有在Python相同的大小,首先兩個列表:Python 2.7中內置了這個函數嗎?
[100, 200, 300, 400]
,我想對方是:
[0, 100, 300, 600]
這是在第二個列表中的每個元素等於總和之前的所有元素。
是否有一個內置的Python函數在列表中執行這樣的操作?或者我必須考慮一個算法來做到這一點?
如果使用Python 3.2+,您可以使用itertools.accumulate
:
>>> import itertools
>>>
>>> a_list = [100, 200, 300, 400]
>>> list(itertools.accumulate([0] + a_list[:-1]))
[0, 100, 300, 600]
UPDATE
爲了避免臨時列表的創建,使用itertools.islice
,itertools.chain
:
>>> from itertools import chain, accumulate, islice
>>>
>>> a_list = [100, 200, 300, 400]
>>> list(accumulate(chain([0], islice(a_list, 0, len(a_list) - 1))))
[0, 100, 300, 600]
'accumulate(chain([0],islice(a_list,0,-1))''會避免創建兩個臨時列表,對於那些關心這類事情的人.BTW忽略列表的最後一個元素看起來像是錯誤的問題,我已經要求提交者澄清。 – user4815162342
@ user4815162342,謝謝你的評論。我更新了答案根據你。順便說一句,'itertools.islice'不接受負指數。 – falsetru
感謝您的更新的代價是提高效率的代價(通常情況下)代碼的可讀性較差,但我仍然相信OP沒有打算忽略輸入列表的最後一個元素。 – user4815162342
我不不認爲這樣的功能存在。你可以寫一個簡單的函數來做到這一點 – shashank93rao
不,沒有內置的2.x. – jonrsharpe
你有意無視第一個列表的最後一個元素嗎?更合乎邏輯的結果是'[0,100,300,600,1000]',或甚至簡單地'[100,300,600,1000]'。 – user4815162342