我有一个
形式的数组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!
答案 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)))
*a
扩展a作为函数的单个参数传入zip(*a)
为我们提供了一个迭代器,返回子列表中第一个项目的元组,子列表中的第二个项目,依此类推。map(sum,zip(*a))
将这些元组相加并返回总和的列表或迭代器(取决于python版本)list
调用将此迭代器转换为列表[python 3] 使用
a = [[1, 0], [1, 1], [0, 0], [0, 1], [1, 0]]
以上电话给出了
[3,2]