我有一个旧列表,我想将每个元素总结为一个新列表:
lst_old = [1, 2, 3, 4, 5]
lst_new = [1, 3, 6, 10, 15]
有没有一种优雅的方法在Python 3中使用短代码和快速代码实现它?除了只显示最后一个元素的sum()
,我无法找到解决问题的正确方法。
答案 0 :(得分: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]
答案 1 :(得分:1)
itertools.accumulate是最好的方法。但是,如果您想要一种明确的方法,请执行以下操作:
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一样基于生成器的解决方案?前进。需要添加验证或异常处理吗?来吧。
然而,没有转变而只是积累?以前的答案是最好的。使用与列表索引的和非常慢,因为复杂性的天空火箭的顺序。
答案 2 :(得分:-1)
您可以使用listname [start:end]获取列表片段的总和,以start和end作为可选参数(默认为列表的开头和结尾):
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)