我在我的python代码中的某个时候感到困惑,我正在尝试构建一个返回累积和的程序,即第i个元素是来自原始列表的第一个i + 1个元素的太阳。所以[1,2,3]的cunmulative总和是[1,3,6],我试图构建程序及其工作但是对于第一个元素它添加最后一个元素作为前一个元素,这让我觉得这是python列表的结构东西圈?
h=[]
a=[1,2,3,4,5,6]
for i in range(len(a)):
d=a[i]+(a[i-1]+1)
h.append(d)
print(h)
结果
[8, 4, 6, 8, 10, 12]
答案 0 :(得分:3)
罪魁祸首是在0 th 迭代中使用a[i - 1]
:
d = a[i] + (a[i - 1] + 1)
实际发生的是i - 1
缩减为-1
,而在python中,a[-1]
指的是列表中的最后一个元素:
In [568]: l = [1, 2, 3, 4]
In [569]: l[-1]
Out[569]: 4
这里的解决方案是从1开始循环。或者,您可以考虑使用临时变量,mentioned here:
a = [1, 2, 3, 4, 5, 6]
h = []
cumsum = 0
for i in a:
cumsum += i
h.append(cumsum)
print(h)
[1, 3, 6, 10, 15, 21]
作为一方,如果你正在使用numpy
,这就像使用np.cumsum
的单个函数调用一样简单:
h = np.cumsum([1, 2, 3, 4, 5, 6])
print(h)
array([ 1, 3, 6, 10, 15, 21])
答案 1 :(得分:1)
只是想补充一点,您可以使用itertools.accumulate
来累积二进制操作的结果,在这种情况下,添加。请注意,itertools.accumulate
实际上默认为添加:
>>> a = [1, 2, 3, 4, 5, 6]
>>> a = [1, 2, 3, 4, 5, 6]
>>> import itertools
>>> list(itertools.accumulate(a))
[1, 3, 6, 10, 15, 21]
但是你可以传递二进制操作并执行累积产品,例如:
>>> list(itertools.accumulate(a ,lambda x, y: x*y))
更好的是,利用operator
模块的力量:
>>> list(itertools.accumulate(a, operator.add)) #cumulative sum
[1, 3, 6, 10, 15, 21]
>>> list(itertools.accumulate(a, operator.mul)) #cumulative product
[1, 2, 6, 24, 120, 720]
>>> list(itertools.accumulate(a, operator.truediv)) #cumulative quotient
[1, 0.5, 0.16666666666666666, 0.041666666666666664, 0.008333333333333333, 0.001388888888888889]
>>> list(itertools.accumulate(a, operator.floordiv)) #cumulative floor div
[1, 0, 0, 0, 0, 0]
答案 2 :(得分:0)
是的 - 它有点像那样。在python中,[-1]为您提供列表的最后一个元素。
如果您使用第一个项目对结果进行种子处理,则从1开始而不是从0开始可以起作用:
a=[1,2,3,4,5,6]
h=[a[0]]
for i in range(1,len(a)):
d=a[i]+(h[i-1])
h.append(d)
print(h)
答案 3 :(得分:0)
列表不是循环的,但可以从开头或结尾引用。您可以使用[-1]从列表末尾引用。
但是,如果您尝试引用仅包含10个元素的列表的第20个元素,则会收到错误。如果列表是循环的,它将引用第10个元素,但它不是。
我想要的是这个,我相信:
a = [1,2,3,4,5,6]
h = []
index = 0
for i in range(len(a) - 1):
first = a[index]
second = a[index + 1]
summation = first + second
h.append(summation)
index += 1
print(h)