对列表执行数学运算(递归与否?



>假设我们有以下列表

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]

相关内容

  • 没有找到相关文章

最新更新