代码之家  ›  专栏  ›  技术社区  ›  Denver Dang

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

  •  0
  • Denver Dang  · 技术社区  · 7 年前

    [[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 回复  |  直到 7 年前
        1
  •  2
  •   steliosbl    7 年前

    您可以使用此函数对每个值求和,而不必将所有内容加载到内存中:

    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)]
    
        2
  •  1
  •   Prince Odame    7 年前

    使用 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]
    
        3
  •  0
  •   Leoli    7 年前

    reduce 因为行可以添加到numpy数组中。

    减少 是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])
    
        4
  •  0
  •   Chetan Ameta    7 年前

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