我有两个迭代器,由一个看起来像这样的“列表”组成:
[[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]
因此,我遍历两个列表,对于每个列表,我需要对各列求和,然后最后将最后两个列表的列归为一个合并的列表。
如果它只是常规列表,我知道该怎么做,但是由于这是迭代器/生成器(不知道正确的术语),所以我真的不确定该怎么做。
答案 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)
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]