问题描述
说我有一个列表a=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
。我想创建一个新列表b
,新列表中的每个值都是每个子列表在该索引位置中所有值的总和。
因此,在这种情况下,它将是[15,18,21,24]
(1 + 5 + 9、2 + 6 + 10、3 + 7 + 11、4 + 8 + 12)
。这就是我目前的代码。
a=[[1,12]]
for i in range(len(a)+1):
b.append(sum(b[i] for b in a))
print(b)
>>> [15,24]
我尝试使用列表推导简化为:
b=[sum([c[i]] for c in a) for i in range(len(a)+1)]
但是我遇到错误TypeError: unsupported operand type(s) for +: 'int' and 'list'
我曾经尝试过搜索该问题,但是我能找到的就是人们在整数中添加列表。在此代码中,只能添加整数(a[c[i]]
)。我做错了什么?
编辑:正如marc Ittel所指出的,[c[i]]
应该只是c[i]
。但是,正如Yatu指出的那样,使用map
和zip
要简单得多。
另外,正如所有人都指出的, 不应为len(a)+1
,而应为len(a[0])
非常感谢大家!
解决方法
这可以使用python的内置函数非常简单地完成:
list(map(sum,zip(*a)))
#[15,18,21,24]
您的方法会产生预期的结果,但是不确定如何定义b
吗?如果它是一个空列表b=[]
,则工作正常。
另外,您是否确定-for i in range(len(a)+1)
?您是否应该迭代内部列表中的所有项目?
您的列表理解应为:
[sum(b[i] for b in a) for i in range(4)]
# [15,24]
在您的代码中,内部级别为[c[i]]
。您正在生成不需要的列表列表。只需索引列表并保留整数b[i]
。
以下代码可能适合您的需求:
[sum(items) for items in zip(*a)]
,
在sum
中,您试图添加列表,删除括号可以解决您的问题。
此外,i
结束于len(a[0])
,而不是len(a)+1
>>> a = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> [sum(c[i] for c in a) for i in range(len(a[0]))]
[15,24]