2016-09-16 105 views
2

我有一箇舊的名單,我想每一個元素總結到一個新的列表:總和所有的列表元素,以新的列表

lst_old = [1, 2, 3, 4, 5] 
    lst_new = [1, 3, 6, 10, 15] 

是否有實現的是Python 3短優雅的方式和快速的代碼?除了僅打印最後一個元素的sum(),我無法找到適合我的問題的解決方案。

回答

7

您可以使用itertools.accumulate,如:

from itertools import accumulate 

lst_old = [1, 2, 3, 4, 5] 
lst_new = list(accumulate(lst_old)) 
# [1, 3, 6, 10, 15] 
+0

誰的文檔在那裏:https://docs.python.org/3/library/itertools.html#itertools.accumulate – Guillaume

-1

您可以使用LISTNAME一個列表的片段的總和[開始:結束],有開始和結束的可選參數(默認爲開頭和列表結尾):

lst_old = [1, 2, 3, 4, 5] 
lst_new = [] 

for i, num in enumerate(lst_old): 
    index = i+1 
    var = sum(lst_old[:index]) 
    print(var) 
    lst_new.append(var) 
+0

Jon的回答也是一樣的。您也可以將起始值傳遞給枚舉,而不是手動遞增。但是,我沒有投票:) – thiruvenkadam

1

itertools.accumulate正如Jon Clements所提到的那樣是最好的方法。然而,如果你想要一個明確的方式做到這一點,這裏有雲:

lst_old = [1, 2, 3, 4, 5] 
sum = 0 
lst_new = [] 
for item in lst_old: 
    sum += item 
    lst_new.append(sum) 

這主要優點是,你可以在一個功能包裝它,如果有任何轉換或驗證需要執行,可以被添加。

例如,假設你要停止功能保持一個極限後去,下面會有所幫助:

def accumulate_items(lst_old, limit=0): 
    sum = 0 
    output_list = [] 
    for item in lst_old: 
     sum += item 
     output_list.append(sum) 
     if limit and sum > limit: 
      break 
    return output_list 

的靈活性將是無限的,如果有任何轉換或操作需要在這裏完成。有一個需要設置的前提條件?前進。有一個需要測試的後置條件?前進。非常龐大的列表,並希望像itertools.accumulate一樣的基於生成器的解決方案?前進。需要添加驗證或異常處理?前進。

但是,沒有變革,只是積累?以前的答案是最好的。與列表索引一起使用的和與複雜天空火箭的順序相當緩慢。