我现在有:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
我希望有:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
仅仅是两个列表的元素相加。
我当然可以迭代这两个列表,但我不想这样做。
最python化的方式是什么?
我现在有:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
我希望有:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
仅仅是两个列表的元素相加。
我当然可以迭代这两个列表,但我不想这样做。
最python化的方式是什么?
当前回答
使用numpy.add()就很简单了
import numpy
list1 = numpy.array([1, 2, 3])
list2 = numpy.array([4, 5, 6])
result = numpy.add(list1, list2) # result receive element-wise addition of list1 and list2
print(result)
array([5, 7, 9])
请参阅这里的医生
如果你想接收一个python列表:
result.tolist()
其他回答
这将适用于2个或更多的列表;遍历列表的列表,但使用numpy加法处理每个列表的元素
import numpy as np
list1=[1, 2, 3]
list2=[4, 5, 6]
lists = [list1, list2]
list_sum = np.zeros(len(list1))
for i in lists:
list_sum += i
list_sum = list_sum.tolist()
[5.0, 7.0, 9.0]
如果您有一个未知数量的列表,并且没有导入任何东西,那么这可能是python式的,稍微有用一些。
只要列表的长度相同,就可以使用下面的函数。
这里*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]
使用map与lambda函数:
>>> map(lambda x, y: x + y, list1, list2)
[5, 7, 9]
有几种方法
使用Numpy
import numpy as np
x = np.array([2,3,3])
y = np.array([1,2,6])
print(type(x)) # <class 'numpy.ndarray'>
print(type(y)) # <class 'numpy.ndarray'>
print(x+y) # [3 5 9]
print(type(x+y)) # <class 'numpy.ndarray'>
在上面的代码中,你可以看到输入和输出都是NumPy数组格式。
import numpy as np
list1=[4,2,2,5]
list2=[2,1,6,7]
print(type(list1)) # <class 'list'>
print(type(list2)) # <class 'list'>
print(np.add(list1,list2)) # [ 6 3 8 12]
print(type(np.add(list1,list2))) # <class 'numpy.ndarray'>
这里输入和输出是不同的格式。
使用Numpy添加
import numpy as np
list1=[3, 1, 4]
list2=[0, 9, 7]
print(type(list1)) # <class 'list'>
print(type(list2)) # <class 'list'>
print(np.add(list1, list2).tolist()) # [3, 10, 11]
print(type(np.add(list1, list2).tolist())) # <class 'list'>
在这个例子中,我们显式地使用to_list()将NumPy数组转换为列表类型
使用Map和Lambda
list1=[1, 3, 3]
list2=[3, 6, 8]
print(map(lambda x,y:x+y, list1, list2)) # <map object at 0x7fea235260a0>
print(list(map(lambda x,y:x+y, list1, list2))) # [4, 9, 11]
使用zip和列表理解
list1=[3, 1, 3]
list2=[1, 1, 3]
print(type(list1)) # <class 'list'>
print(type(list2)) # <class 'list'>
print(x + y for x, y in zip(list1, list2)) # <generator object <genexpr> at 0x7f755307b6d0>
print(list(x + y for x, y in zip(list1, list2))) # [4, 2, 6]
print(type([x + y for x, y in zip(list1, list2)])) # <class 'list'>
print(sum(x) for x in zip(list1, list2)) # <generator object <genexpr> at 0x7f4c623e76d0>
print(list(sum(x) for x in zip(list1, list2))) # [4, 2, 6]
print(type([sum(x) for x in zip(list1, list2)])) # <class 'list'>
使用Map和operator.add
from operator import add
list1=[3, 1, 3]
list2=[1, 1, 3]
print(list(map(add, list1, list2))) # [4, 2, 6]
如果您需要处理不同大小的列表,不用担心!很棒的itertools模块已经介绍过了:
>>> from itertools import zip_longest
>>> list1 = [1,2,1]
>>> list2 = [2,1,2,3]
>>> [sum(x) for x in zip_longest(list1, list2, fillvalue=0)]
[3, 3, 3, 3]
>>>
在Python 2中,zip_longest被称为izip_longest。
参见相关回答,并对另一个问题进行评论。