list1 = [1, 2, 3]
list2 = [4, 5, 6]
我希望拥有:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
仅是两个列表的元素加法。
我当然可以迭代两个列表,但是我不想这样做。
最Python化的方式是什么?
#1 楼
将map
与operator.add
结合使用: br /> >>> from operator import add
>>> list( map(add, list1, list2) )
[5, 7, 9]
评论
如果使用这些巨大的数组,则@BasSwinckels的numpy解决方案可能是您应该关注的东西。
–亨利·戈默索尔(Henry Gomersall)
2013年9月10日上午8:34
您在这些计时中使用了哪个Python版本?
– arshajii
2013年9月16日0:20在
N.B. -在python3中,map()返回可迭代的件事,而不是列表。如果确实需要一个实际列表,则第一个答案是list(map(add,list1,list2))
– FLHerne
16 Mar 24 '16 at 11:25
注意@FLHerne与map一起指出的python3问题随着时间的推移将变得越来越重要。 Python 2将在不到3年的时间内失去官方支持。
–nealmcb
17-4-10在0:29
在很多时候,python语法确实非常优雅和简单,但是不幸的是,这并不是其中之一。对于这样一个简单的任务,真是可惜...。当已经有.extend()方法时,为什么要使“ +”连接列表?
– Nic Scozzaro
18-11-13在2:37
#2 楼
其他人给出了如何在纯python中执行此操作的示例。如果要对具有100.000个元素的数组执行此操作,则应使用numpy:In [1]: import numpy as np
In [2]: vector1 = np.array([1, 2, 3])
In [3]: vector2 = np.array([4, 5, 6])
现在,按元素进行加法与
In [4]: sum_vector = vector1 + vector2
In [5]: print sum_vector
[5 7 9]
就像在Matlab中一样。
与Ashwini最快版本进行比较的时机:因此这快25倍!但是,请使用适合您情况的内容。对于一个简单的程序,您可能不想安装numpy,因此请使用标准的python(我发现Henry的版本是最Pythonic的版本)。如果您正认真处理数字,请让
numpy
完成繁重的工作。对于速度怪胎:似乎numpy解决方案从n = 8
开始更快。#3 楼
[a + b for a, b in zip(list1, list2)]
评论
@deltab接受的答案更快,并且包含此答案(信息更多)
– Sibbs赌博
2013年9月11日上午10:02
@ perfectionm1ng虽然我理解您的观点(并且一点也不gr惜),但我只是想指出,我将始终使用我提出的解决方案(鉴于它不需要导入,因此可以说是最简单的解决方案) (可能是更Python的语言),或者在速度很重要的地方,这是巴斯文克尔(Bas Swinckel)的答案,这绝对是速度重要的正确选择。
–亨利·戈默索尔(Henry Gomersall)
2013年9月11日10:41
是。感谢您的意见。但是从本质上讲[zip(list1,list2)中x的sum(x)]与您的答案相同,不是吗? :)
– Sibbs赌博
2013年9月11日上午10:55
@ perfectionm1ng或多或少(尽管它是在我的编辑后添加的:)。就个人而言,我更喜欢a + b表示法,并带有明确的元组拆包,以提高可读性和Python感。
–亨利·戈默索尔(Henry Gomersall)
2013年9月11日在11:01
#4 楼
正如其他人所描述的那样,一种快速且节省空间的解决方案是使用numpy(np),它具有内置的矢量操作功能:1。使用Numpy
x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y
2。具有内置
2.1 Lambda
list1=[1, 2, 3]
list2=[4, 5, 6]
print map(lambda x,y:x+y, list1, list2)
请注意map()支持多个参数。
2.2 zip和列表理解
list1=[1, 2, 3]
list2=[4, 5, 6]
print [x + y for x, y in zip(list1, list2)]
评论
λ方法为+1。可耻的是,该解决方案与其他在其他地方重复使用的解决方案结合在一起。
–LondonRob
19年1月20日在19:14
#5 楼
在我看来,使用numpy
更简单:import numpy as np
list1=[1,2,3]
list2=[4,5,6]
np.add(list1,list2)
结果:
有关详细的参数信息,在这里检查:numpy.add
#6 楼
也许“最蟒蛇的方式”应该包括处理list1和list2大小不相同的情况。应用其中一些方法将悄悄地为您提供答案。 numpy方法会让您知道,很可能出现ValueError。示例:
import numpy as np
>>> list1 = [ 1, 2 ]
>>> list2 = [ 1, 2, 3]
>>> list3 = [ 1 ]
>>> [a + b for a, b in zip(list1, list2)]
[2, 4]
>>> [a + b for a, b in zip(list1, list3)]
[2]
>>> a = np.array (list1)
>>> b = np.array (list2)
>>> a+b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2) (3)
如果在您遇到问题的功能?
评论
在这种情况下,绝对应该使用填充值为0的itertools查看zip_longest。
– Ma0
6月23日7:41
#7 楼
使用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()
#8 楼
这将适用于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]
#9 楼
如果列表数量未知,并且不导入任何内容,这可能是pythonic的,并且稍微有用。只要列表长度相同,就可以使用以下函数。
这里* 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]
#10 楼
将地图与lambda函数一起使用:>>> map(lambda x, y: x + y, list1, list2)
[5, 7, 9]
#11 楼
我尚未计时,但我怀疑这会很快:import numpy as np
list1=[1, 2, 3]
list2=[4, 5, 6]
list_sum = (np.add(list1, list2)).tolist()
[5, 7, 9]
#12 楼
如果您需要处理不同大小的列表,请不用担心!精彩的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
。另请参阅此相关答案和评论另一个问题。
#13 楼
[list1[i] + list2[i] for i in range(len(list1))]
评论
更多pythonic将是[zip(list1,list2)中(a,b)的[a + b]]
–rayryeng
17年5月30日在20:50
@rayryeng或不带括号:[a + b表示zip中的a,b(list1,list2)]
–dionyziz
12月11日下午5:37
#14 楼
虽然,实际的问题并不想遍历列表以生成结果,但是已经提出的所有解决方案实际上都是在后台进行的!刷新:如果不查看所有矢量元素,则不能添加两个矢量。因此,大多数这些解决方案的算法复杂度为Big-O(n)。其中n是向量的维数。
因此,从算法的角度来看,使用for循环迭代生成结果列表也是合乎逻辑的和pythonic的。但是,此外,此方法没有调用或导入任何其他库的开销。
# Assumption: The lists are of equal length.
resultList = [list1[i] + list2[i] for i in range(len(list1))]
此处显示/讨论的时序是系统和实现。依赖,并且不能以可靠的方式来衡量运营效率。在任何情况下,向量加法运算的O复杂度都是线性的,这意味着O(n)。
#15 楼
a_list = []
b_list = []
for i in range(1,100):
a_list.append(random.randint(1,100))
for i in range(1,100):
a_list.append(random.randint(101,200))
[sum(x) for x in zip(a_list , b_list )]
#16 楼
zip功能在这里非常有用,可与列表理解
v1
,v2
一起使用。如果有列表列表(而不是两个列表),则可以使用
v3
。不同的长度(例如:在第一个/首个列表的末尾加1),然后可以尝试类似的操作(使用zip_longest)-v4
first = [1, 2, 3, 1]
second = [4, 5, 6]
output: [5, 7, 9, 1]
如果未知数量的相同长度的列表,则可以使用函数
v5
。v6
-操作员模块导出一组有效的与Python的内在运算符相对应的函数。例如,operator.add(x, y)
等效于表达式x+y
。 /> v7
评论
点评来源:不建议在堆栈溢出上使用仅代码的答案,因为它们没有解释它如何解决问题。请编辑您的答案,以解释该代码的作用以及如何回答该问题,以便它对OP以及遇到类似问题的其他用户也很有用。请参阅:我如何写一个好的答案?谢谢
–sɐunıɔןɐqɐp
8月5日8:04
评论
在Python中添加简明向量可能重复吗?