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

时间:2018-08-13 09:59:37

标签: python iterator

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

[[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]

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

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

4 个答案:

答案 0 :(得分:2)

您可以使用它对每个值求和而不将所有内容加载到内存中

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)]

答案 1 :(得分:1)

使用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]

答案 2 :(得分:0)

使用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])

答案 3 :(得分:0)

使用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]