【发布时间】:2016-09-16 13:52:31
【问题描述】:
我有一个旧列表,我想将每个元素汇总到一个新列表中:
lst_old = [1, 2, 3, 4, 5]
lst_new = [1, 3, 6, 10, 15]
有没有一种优雅的方法可以在 Python 3 中使用简短而快速的代码来实现它?除了 sum() 仅打印最后一个元素之外,我找不到适合我的问题的解决方案。
【问题讨论】:
标签: python list python-3.x
我有一个旧列表,我想将每个元素汇总到一个新列表中:
lst_old = [1, 2, 3, 4, 5]
lst_new = [1, 3, 6, 10, 15]
有没有一种优雅的方法可以在 Python 3 中使用简短而快速的代码来实现它?除了 sum() 仅打印最后一个元素之外,我找不到适合我的问题的解决方案。
【问题讨论】:
标签: python list python-3.x
您可以使用itertools.accumulate,例如:
from itertools import accumulate
lst_old = [1, 2, 3, 4, 5]
lst_new = list(accumulate(lst_old))
# [1, 3, 6, 10, 15]
乔恩克莱门茨提到的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 一样?前进。需要添加验证或异常处理?来吧。
但是,没有转化而只是积累?上一个答案是最好的。将 sum 与列表索引一起使用会非常慢,因为复杂度的顺序会飞速增长。
【讨论】:
您可以使用 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)
【讨论】: