如何对两个迭代器"列表"中的值求和?



我有两个迭代器,它由一个看起来像这样的"列表"组成:

[[1, 2, 3, 4, 5, 6],
[2, 4, 6, 8, 10, 12],
[3, 5, 8, 6, 1, 19],
[5, 9, 1, 9, 4, 6]]

或者,如果我只是对它们运行一个for循环,这就是它的样子。

迭代器而不是列表本身的原因是由于内存。真正的列表/数组要大得多,这只是一个例子。 我需要做的是获取一个列表,并将列表中每个索引的列相加,用于所有"外部"索引,然后将它们相加用于两个列表,如sum(list1) + sum(list2)

所以基本上:

list1:                   list2:
[[1, 2, 3, 4, 5, 6],     [[5, 4, 3, 2, 1, 9],
[2, 4, 6, 8, 10, 12],    [6, 3, 8, 1, 1, 6],  
[3, 5, 8, 6, 1, 19],     [1, 3, 2, 8, 2, 3],
[5, 9, 1, 9, 4, 6]]      [5, 2, 9, 4, 2, 5]]
=>                       =>
[11, 20, 18, 20, 43]     [17, 12, 22, 15, 23]
=>
[28, 32, 40, 35, 66]

因此,我遍历了两个列表,对于每个列表,我需要对列求和,最后将最后两个列表的列合并为一个组合列表。

如果只是常规列表,我知道该怎么做,但由于这是迭代器/生成器(不知道正确的术语(,我真的不确定它是如何完成的。

您可以使用它对每个求和,而无需将所有内容加载到内存中:

def sumIter(iter):
result = [0, 0, 0, 0, 0, 0] #Assuming there are always 6 items in each sub-list
for list in iter:
result = [(result[i] + list[i]) for i in range(6)]

然后:

sum1 = sumIter(iter1)
sum2 = sumIter(iter2)
result = [(sum1[i] + sum2[i]) for i in range(6)]

使用zip

前任:

l1 = [
[1, 2, 3, 4, 5, 6],
[2, 4, 6, 8, 10, 12],
[3, 5, 8, 6, 1, 19],
[5, 9, 1, 9, 4, 6]
]
l2 = [
[5, 4, 3, 2, 1, 9],
[6, 3, 8, 1, 1, 6],
[1, 3, 2, 8, 2, 3],
[5, 2, 9, 4, 2, 5]
]

l1 = (sum(i) for i in zip(*l1))
l2 = (sum(i) for i in zip(*l2))
print( [sum(i) for i in zip(l1, l2)] )

输出:

[28, 32, 40, 42, 26, 66]

使用reduce因为可以在 numpy 数组中添加行。

reduce是 python2 中的内置函数

import numpy as np
from functools import reduce # only in python3
def sumup(one_row, another_row):
return one_row + another_row
test_list = np.array([[1, 2, 3, 4, 5, 6],
[2, 4, 6, 8, 10, 12],
[3, 5, 8, 6, 1, 19], 
[5, 9, 1, 9, 4, 6]])
reduce(sumup, test_list)

输出

array([11, 20, 18, 27, 20, 43])

使用 numpy.sum

import numpy as np
l1 = np.sum([[1, 2, 3, 4, 5, 6], [2, 4, 6, 8, 10, 12], [3, 5, 8, 6, 1, 19], [5, 9, 1, 9, 4, 6]], axis=0)
l2 = np.sum([[5, 4, 3, 2, 1, 9],[6, 3, 8, 1, 1, 6], [1, 3, 2, 8, 2, 3],[5, 2, 9, 4, 2, 5]], axis=0)
print(l1 + l2)

输出

[28 32 40 42 26 66]

最新更新