Sum在Python中列出相应索引值的值

时间:2014-09-19 03:27:08

标签: python list sum

我使用了一个大清单来表示很多需要的值,这对我来说真的很复杂。

例如:

    [[[a,b,c],[d,e,f]],
     [[g,h,i],[j,k,l]],
     [[o,p,u],[r,s,t]]]

我想将三个主要指数及其相应的价值结合在一起。我不是故意连接。

例如,结果将是:

    [[(a+g+o),(b+h+p),(c+i+u)],[(d+j+r),(e+k+s),(f+l+t)]]

有人可以帮助我如何完成这个结果吗?谢谢!

2 个答案:

答案 0 :(得分:1)

你走了。既然你说添加,我假设a,b,c等都是整数。

>> a = [[[1,2,3],[4,5,6]],
... [[7,8, 9],[10, 11, 12]],
... [[16, 17, 18],[13, 14, 15]]]

>>> temp_list = list(zip(*b) for b in zip(*a))
>>> result = [[sum(list(a)) for a in b] for b in temp_list]
>>> result
[[24, 27, 30], [27, 30, 33]]

令人生畏的单行将是:

[[sum(list(a)) for a in b] for b in list(zip(*b) for b in zip(*a))]

让我们逐行逐步完成代码。

  1. zip(*a)会给你:

    >>> zip(*a)
    [([1, 2, 3], [7, 8, 9], [16, 17, 18]), ([4, 5, 6], [10, 11, 12], [13, 14, 15])]
    

    它结合了第一个最内列的子列表。

  2. 我们需要另外做ziplist(zip(*b) for b in zip(*a))会给我们:

    [[(1, 7, 16), (2, 8, 17), (3, 9, 18)], [(4, 10, 13), (5, 11, 14), (6, 12, 15)]]
    
  3. 现在我们只需要对它们求和并创建一个列表列表。所以我们这样做:

    [[sum(list(a)) for a in b] for b in temp_list]
    
  4. 如果列表很大,我建议使用名为izip()itertools'版zip。但izip()返回生成器而不是列表。因此,您需要将其转换为列表。

答案 1 :(得分:0)

这种事情确实需要numpy

>>> a = [[[ 1, 2, 3], [ 4, 5, 6]],
        [ [ 7, 8, 9], [10,11,12]],
        [ [13,14,15], [16,17,18]]]
>>> import numpy
>>> numpy.array(a).sum(axis=0)
array([[21, 24, 27],
       [30, 33, 36]])

array函数将数据转换为numpy数组。这样的阵列可以非常有力地操纵。在您的情况下,您希望沿第一个(即第零个)轴求和。这是通过调用sum(axis=0)

来完成的