假设我们有以下列表
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
什么是可以解决这个问题的功能
答案 0 :(得分:4)
[sum(lst[:i+1])+1 for i in range(len(lst))]
最终列表中的每个元素都是原始列表中一个连续元素的总和,对吧?列表推导擅长于从迭代构建列表:)
以下是我们正在做的事情,以及here's the docs on list comps:
[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 :(得分:2)
如果模式是累积和+ 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]
答案 2 :(得分:1)
这可能比列表理解更容易理解:
result = []
total = 1
lst = [3,6,1,4]
for value in lst:
total += value
result.append(total)
print result
答案 3 :(得分:0)
这在您的特定情况下没用,因为您想要为所有内容添加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不起作用,对不起。我会留在这里以防其他人发现它有用。
答案 4 :(得分:0)
您还可以使用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]