我正在尝试添加列表的每个元素,从位置1开始,使用前面的值,即:
mylist = [1, 2, 7, 3, 10]
会计算:
mylist = [1, 2+1, 7+3, 3+10, 10+13]
获得:
mylist = [1, 3, 10, 13, 23]
我可以使用以下代码获得我想要的结果:
counter, counter1 = 0, 1
for n in mylist[1:]:
mylist[counter1] = mylist[counter1] + mylist[counter]
counter += 1
counter1 += 1
五行代码似乎太多了,因为在我看来这是一个非常简单的问题。任何人都有一个更时尚的解决方案?
答案 0 :(得分:1)
您可以在单个列表理解中执行此操作,只需将当前项添加到所有前面项的切片总和中:
mylist = [item + sum(mylist[:index]) for index, item in enumerate(mylist)]
答案 1 :(得分:1)
您要做的是累计金额。在numpy
中有一个函数numpy.cumsum
,您可以直接使用它。这可能是效率最高的。
或者,您需要的是一个计数器,当您遍历列表时添加元素:
newList = []
counter = 0
for n in mylist:
counter += n
newList.append(counter)
这是更加pythonic的方式。虽然,您可以随时更换元素:
for i, n in enumerate(mylist[1:]):
mylist[i+1] = mylist[i] + n
循环中列表元素的就地更新通常不是一个好主意,所以我不鼓励你这样做。
您可以使用reduce
。这是一种功能性方法。这需要您批判性地思考您的算法。这使用lambda函数,并且通常被Python程序员嘲笑,因为它对大多数人来说并不总是非常易读(尽管我发现它可以并且用于我自己的程序)。
In [356]: reduce( lambda x, y: x + [x[-1] + y], mylist, [0])[1:]
Out[356]: [1, 3, 10, 13, 23]
请记住,在这种情况下,您需要传递一个初始值,这是上面所做的。或者,您可以尝试:
In [357]: reduce( lambda x, y: x + [x[-1] + y], mylist[1:], mylist[:1])
Out[357]: [1, 3, 10, 13, 23]
对于同样的事情来说,它更清洁......
最后,您可以使用列表推导。这已经显示,但对于使用的切片,我不知道它是否比reduce
有了显着的改进。