将两个列表中的值相加得到一个新的列表

181

我有以下两个列表:

first = [1,2,3,4,5]
second = [6,7,8,9,10]

现在我想将这两个列表中的项目添加到一个新列表中。

输出应该是

third = [7,9,11,13,15]

这个回答解决了你的问题吗?两个列表的逐元素相加? - Abdul Aziz Barkat
23个回答

285

zip函数在这里非常有用,可以与列表推导一起使用。

[x + y for x, y in zip(first, second)]
如果您有一个列表的列表(而不仅是两个列表):
lists_of_lists = [[1, 2, 3], [4, 5, 6]]
[sum(x) for x in zip(*lists_of_lists)]
# -> [5, 7, 9]

2
只是好奇如果 zip() 处理不同长度的数组会怎么样?也就是说,zip 对于不同长度的数组返回什么,以及这将如何影响 x + y 的操作。 - ealeon
9
当最短的可迭代对象用尽时,“压缩”操作就会停止。因此,如果first长度为10,而second长度为6,则将这两个可迭代对象进行压缩操作的结果长度为6。 - tom
当您不知道列表数量时,有没有一种方法可以做到这一点? - traggatmot
@traggatmot:>>> lists_of_lists = [[1, 2, 3], [4, 5, 6]] >>> [sum(x) for x in zip(*lists_of_lists)] [5, 7, 9] - tom
@user1586957,“...for x,y in...”可以解构2元组,无需显式索引输出元组。 - tom
显示剩余3条评论

55

来自文档

import operator
list(map(operator.add, first,second))

2
你的意思是:list(map(operator.add, first,second)) - Minions

54

numpy.addnumpy.subtract等)的默认行为是逐元素进行操作:

import numpy as np
np.add(first, second)

输出

array([7,9,11,13,15])

3
迄今为止最好的答案。 - Ian
它应该可以工作,但在我的实验中却没有...我不知道为什么,但是对我来说,NumPy似乎是一个强大而复杂的库... - decadenza
@decadenza 你是怎么做这个实验的? - Ashfaq
嗨@Ashfaq,许多月过去了,我更好地了解了Numpy库。我在np.array定义上错了。抱歉。 - decadenza
4
使用np.add(first, second).tolist()将结果转换为列表。 - talekeDskobeDa
显示剩余2条评论

36

假设列表 ab 长度相同,则不需要使用zip、numpy或任何其他工具。

Python 2.x和3.x:

[a[i]+b[i] for i in range(len(a))]

如果我们需要计算超过两个列表的结果总和列表,这似乎非常不错。 - lazarus

13

尝试以下代码:

first = [1, 2, 3, 4]
second = [2, 3, 4, 5]
third = map(sum, zip(first, second))

这个简洁明了的解决方案值得一试。值得注意的是,这也适用于超过2个列表的情况:map(sum, zip(first, second, third, fourth, ...)) - Johan Dettmar

11

这适用于任意数量的列表:

[sum(sublist) for sublist in itertools.izip(*myListOfLists)]

在你的情况下,myListOfLists 将是 [first, second]


1
你确定使用 izip.from_iterable 吗? - DSM
1
@DSM:该死!我想我在想“链”。已更新。 - inspectorG4dget

6
first = [1, 2, 3, 4, 5]
second = [6, 7, 8, 9, 10]
three = list(map(sum, first, second))
print(three)



# Output 
[7, 9, 11, 13, 15]

lambda x, y: x + y 可以简单地写成 sum - ggorlen

6

完成这个任务的简单快捷方法是:

three = [sum(i) for i in zip(first,second)] # [7,9,11,13,15]

或者,您可以使用numpy sum:

from numpy import sum
three = sum([first,second], axis=0) # array([7,9,11,13,15])

1
这个很好地推广到更长的列表,这正是我所需要的! - Vectornaut

6

一行解决方案

list(map(lambda x,y: x+y, a,b))

3
如果你有多个未知长度的列表,你可以使用下面的函数。
这里的*args接受可变数量的列表参数(但只计算每个列表中相同数量的元素之和)。 再次使用*来解包每个列表中的元素。
def sum_lists(*args):
    return list(map(sum, zip(*args)))

a = [1,2,3]
b = [1,2,3]  

sum_lists(a,b)

输出:

[2, 4, 6]

或者使用3个列表

sum_lists([5,5,5,5,5], [10,10,10,10,10], [4,4,4,4,4])

输出:

[19, 19, 19, 19, 19]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接