【问题标题】:Sum list of list of tuples元组列表的总和列表
【发布时间】:2019-03-22 17:35:02
【问题描述】:

我发现对数字列表求和是:

In [9]: l = [[3,7,2],[1,4,5],[9,8,7]]
In [10]: [sum(i) for i in zip(*l)]
Out[10]: [13, 19, 14]

但是我一直在努力寻找一种方法来汇总元组列表以生成元组列表

In [9]: l = [[(1, 1), (1, 1), (1, 1)],[(2, 2), (2, 2), (2, 2)]]
In [10]: [(sum(i[0]), sum(i[1])) for i in zip(*l)] #Did not work

这是我想要的输出:

Out[10]: [(3, 3), (3, 3), (3, 3)]

谢谢!

【问题讨论】:

    标签: python list tuples list-comprehension


    【解决方案1】:

    您可以在列表推导中使用 tuple 推导:

    L = [[(1, 1), (1, 1), (1, 1)], [(2, 2), (2, 2), (2, 2)]]
    
    res = [tuple(sum(j) for j in zip(*i)) for i in zip(*L)]
    
    [(3, 3), (3, 3), (3, 3)]
    

    或者使用map 获得更实用的替代方案:

    res = [tuple(map(sum, zip(*i))) for i in zip(*L)]
    

    对于较大的列表,您可能希望考虑使用 3rd 方库,例如 NumPy,在 NumPy 术语中,您只需要在指定轴上求和:

    import numpy as np
    
    A = np.array(L)
    
    res = A.sum(axis=0)
    
    array([[3, 3],
           [3, 3],
           [3, 3]])
    

    【讨论】:

      【解决方案2】:

      你可以先递归地展平迭代

      >>> import collections
      >>> 
      >>> def flatten(l):
      ...     for el in l:
      ...         if isinstance(el, collections.Iterable) and not isinstance(el, str):
      ...             for sub in flatten(el):
      ...                 yield sub
      ...         else:
      ...             yield el
      ... 
      >>> sum(flatten(l))
      18
      

      有关flatten 的更多详细信息,请参阅this link

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-31
        相关资源
        最近更新 更多