在Python中,如何对嵌套列表求和:[[1,0],[1,1],[1,0]]→[3,1]

时间:2016-02-13 07:50:51

标签: python list

我有一个

形式的数组
a = [[1, 0], [1, 1], [0, 0], [0, 1], [1, 0]]

我需要在嵌套列表中对相同索引的所有值求和,以便上面得到

[3,2]

这可以通过以下代码

来实现
b = [0]*len(a[0])
for x in a:
  b = map(sum, zip(b,x))

由于a包含数百个列表,我想知道是否有更好的方法可以做到这一点。这些嵌套列表在每个运行中的长度始终相同,在上面的示例中为2,但它可能只有1或3或更多,因此将b初始化为[0]*len(a[0])

不同长度的例子如下:

# nested lists always have 3 items
a = [[1, 0, 1], [1, 1, 1], [0, 0, 1], [0, 1, 1], [1, 0, 0]]
# result: [3, 2, 4]

# nested lists always have 1 item
a = [[1], [1], [0], [0], [1]]
# result: [3]

# mixed lengths would never happen
a = [[1], [0,1], [0], [0,1,1]] # no, this not!

4 个答案:

答案 0 :(得分:9)

您可以简单地转置初始矩阵并对每一行求和:

b = [sum(e) for e in zip(*a)]

答案 1 :(得分:3)

解决方案

如果您的列表有不同的长度,请使用SUM(CASE WHEN past."is_going" = False THEN 1 ELSE 0 END) (Python 2中的zip_longest),填充值为izip_longest

0

你的意图(猜测)

>>> from itertools import zip_longest

>>> a = [[1, 0], [1, 1], [0, 0], [0, 1], [1, 0], [10, 20, 30]]
>>> [sum(x) for x in (zip_longest(*a, fillvalue=0))]
[13, 22, 30]

现在为b = [0] * max(map(len, a)) for x in a: res = list(map(sum, zip(b, x))) b[:len(res)] = res

a

您将获得a = [[1, 0], [1, 1], [0, 0], [0, 1], [1, 0], [10, 20, 30]]

b

答案 2 :(得分:2)

这正是您希望利用numpy进行操作的那种操作。

import numpy as np
a = [[1, 0], [1, 1], [0, 0], [0, 1], [1, 0]]
arr = np.array(a)
arr.sum(axis=0)
=> array([3, 2])

如果必须将结果作为列表而不是numpy数组,则可以使用numpy数组的.tolist()方法。

答案 3 :(得分:1)

我这样做

b = list(map(sum,zip(*a)))
  1. *a扩展a作为函数的单个参数传入
  2. zip(*a)为我们提供了一个迭代器,返回子列表中第一个项目的元组,子列表中的第二个项目,依此类推。
  3. map(sum,zip(*a))将这些元组相加并返回总和的列表或迭代器(取决于python版本)
  4. 最后list调用将此迭代器转换为列表[python 3]
  5. 使用

    a = [[1, 0], [1, 1], [0, 0], [0, 1], [1, 0]]
    

    以上电话给出了

    [3,2]