将列表的每个前置值添加到下一个

时间:2014-11-12 08:43:36

标签: list python-2.7

我正在尝试添加列表的每个元素,从位置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

五行代码似乎太多了,因为在我看来这是一个非常简单的问题。任何人都有一个更时尚的解决方案?

2 个答案:

答案 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有了显着的改进。