>假设我们有以下列表
lst = [3,6,1,4]
我希望能够从此列表中获得以下结果
result = [4, 10, 11, 15]
计算模式如下:
1 + 3 = 4
1 + 3 + 6 = 10
1 + 3 + 6 + 1 = 11
1 + 3 + 6 + 1 + 4 = 15
换句话说,结果是 1 加上输入数组的累积总和。
如何定义一个可以解决这个问题的函数?
[sum(lst[:i+1])+1 for i in range(len(lst))]
最终列表的每个元素都是原始列表的另一个连续元素的总和,对吧?列表推导擅长从可迭代对象构建列表:)
以下是我们正在做的事情,以下是列表组合上的文档:
[sum(lst[:i+1])+1 for i in range(len(lst))]
^^^^^^^^^^^^^^^^
# This element is the sum+1 of the slice starting at lst[0] and ending at i,
[sum(lst[:i+1])+1 for i in range(len(lst))]
^^^^^^^^^^^^^^^^^^^^^^^^
# Do this for one element each for every i in range(len(lst))
[sum(lst[:i+1])+1 for i in range(len(lst))]
^ ^
# And give me the results as a list.
请注意,您也可以使用相同的格式执行生成器表达式,但用 ()
而不是 []
将它们括起来,并且您可以使用{key:value for key,value in iterable}
如果模式是累积总和 + 1,这应该可以。使用基本的生成器和解决方案相当容易和高效。
def csum(mylist, c=1):
total = c
for i in mylist:
total += i
yield total
lst = [3,6,1,4]
print list(csum(lst))
输出 : [4, 10, 11, 15]
这可能比列表理解更容易理解:
result = []
total = 1
lst = [3,6,1,4]
for value in lst:
total += value
result.append(total)
print result
这在您的特定情况下没有用,因为您想向所有内容添加 1,但您可以使用原始列表:
In [1]: lst = [3,6,1,4]
In [2]: from itertools import accumulate
In [3]: list(accumulate(lst))
Out[3]: [3, 9, 10, 14]
或者你可以1
添加到列表的开头,然后将其砍掉
In [1]: lst = [1,3,6,1,4]
In [2]: from itertools import accumulate
In [3]: list(accumulate(lst))
Out[3]: [1, 4, 10, 11, 15]
In [4]: list(accumulate(lst))[1:]
Out[4]: [4, 10, 11, 15]
编辑:刚刚检查,这不适用于 2.7,对此感到抱歉。 我会把它留在这里,以防其他人觉得它有用。
你也可以使用 numpy cumsum 函数
import numpy as np
lst=[3,6,1,4]
result=np.cumsum(lst)+1
如果您希望结果作为列表而不是 NP 数组:
result=list(np.cumsum(lst)+1)
result
[4, 10, 11, 15]