繁体   English   中英

对 Python 中列表的元素求和

[英]Summing elements of list of lists in Python

我有以下列表:

myList = [[8100, 3], [8200, 5], [8400, 8]]

我想将每个子列表的第二个元素与下一个列表的下一个第二个元素相加,依此类推。

以下是它的外观:

myList = [[8100, 3], [8200, 5], [8400, 8]]
myNewList = [[8100, 3], [8200, 8], [8400, 16]]

因为 3+5=8、8+8=16 等等。 有什么方法可以做到这一点吗? 或者我应该为此编写自己的 function ,例如使用 NumPy ?

使用np.cumsum ,因为您的数组很大或者您想做进一步的操作。 对于较小的定制 python function 会更好。

a = np.array(myList)
a[:, 1] = a[:, 1].cumsum()

Output

array([[8100,    3],
       [8200,    8],
       [8400,   16]])

您可以通过O(n)一次获得结果,并且无需分配任何额外的空间O(1) ,除非您希望通过从第一个元素循环,逐步更新要求和的项目,如下所示:

In [1]: A = [[8100, 3], [8200, 5], [8400, 8]]

In [2]: for i in range(1, len(A)):
            A[i][-1] += A[i-1][-1]

In [3]: A
Out[3]: [[8100, 3], [8200, 8], [8400, 16]]

这种方法应该有效:

myNewList = []
value = 0
for sublist in myList:
    value = sublist[1]+value
    newSublist = [sublist[0],value]
    myNewList.append(newSublist) 

所以只需将先前的值存储在临时变量中,然后将其添加到下一个子列表的第二个元素中。

col1, col2 = zip(*myList)
# col1 == (8100, 8200, 8400), col2 == (3, 5, 8)
sums = [ sum(col2[:i]) for i, _ in enumerate(col2, 1) ]
# sums == [3, 8, 16]
myNewList = [ list(x) for x in zip(col1, sums) ]
# myNewList == [[8100, 3], [8200, 8], [8400, 16]]

解决这个问题的一个非常简单的方法是维护一个total变量并用这个总和替换每个子列表的第二个值。

myList = [[8100, 3], [8200, 5], [8400, 8]]
total, new_list = 0, []

for sublist in myList:
    total += sublist[1]
    new_list.append([sublist[0],total])

print(new_list)

Output

[[8100, 3], [8200, 8], [8400, 16]]

您可以使用新的赋值运算符(或海象运算符)在推导式中创建累加器:

myList = [[8100, 3], [8200, 5], [8400, 8]]

acc=0
new_list=[[sl1, acc := acc + sl2] for sl1, sl2 in myList]
>>> new_list
[[8100, 3], [8200, 8], [8400, 16]]

这仅适用于 Python 3.8+

我为你做了一个尽可能清楚的例子:如果你考虑合并循环,你可以使 function 更干燥、更高效。

L = [[8100, 3], [8200, 5], [8400, 8]]

def newList(L):
    gen = []
    for subL in L:
        if len(gen) > 0:
            gen.append(gen[-1] + subL[1])
        else:
            gen.append(subL[1])

    for idx, subL in enumerate(L):
        subL[1] = gen[idx]

    print(L)

newList(L)

Output:

[[8100, 3], [8200, 8], [8400, 16]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM