我经常添加Python列表的向量.
示例:我有两个这样的列表:
a = [0.0, 1.0, 2.0]
b = [3.0, 4.0, 5.0]
Run Code Online (Sandbox Code Playgroud)
我现在想要将a添加到a以获得结果a = [3.0, 5.0, 7.0].
通常我最终这样做:
a[0] += b[0]
a[1] += b[1]
a[2] += b[2]
Run Code Online (Sandbox Code Playgroud)
是否有一些有效,标准的方法来减少打字?
更新:可以假设列表长度为3并包含浮点数.
gim*_*mel 38
如果您需要高效的矢量运算,请尝试Numpy.
>>> import numpy
>>> a=numpy.array([0,1,2])
>>> b=numpy.array([3,4,5])
>>> a+b
array([3, 5, 7])
>>>
Run Code Online (Sandbox Code Playgroud)
或者(谢谢Andrew Jaffe),
>>> a += b
>>> a
array([3, 5, 7])
>>>
Run Code Online (Sandbox Code Playgroud)
bes*_*sen 36
我认为你不会找到比问题中提出的3个总和更快的解决方案.使用较大的向量可以看到numpy的优点,如果需要其他运算符,也可以看到numpy的优点.numpy对于矩阵特别有用,女巫是python列表的技巧.
不过,还有另一种方法:D
In [1]: a = [1,2,3]
In [2]: b = [2,3,4]
In [3]: map(sum, zip(a,b))
Out[3]: [3, 5, 7]
Run Code Online (Sandbox Code Playgroud)
编辑:你也可以使用itertools的izip,它是zip的生成器版本
In [5]: from itertools import izip
In [6]: map(sum, izip(a,b))
Out[6]: [3, 5, 7]
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 33
虽然数字非常好,而列表理解解决方案如果你真的想要创建一个新列表,我很惊讶没有人建议"一个明显的方法来做到这一点" - 一个简单的for循环!最好:
for i, bi in enumerate(b): a[i] += bi
Run Code Online (Sandbox Code Playgroud)
还好,有点排序:
for i in xrange(len(a)): a[i] += b[i]
Run Code Online (Sandbox Code Playgroud)
Geo*_*lly 19
如果您认为Numpy过度,那么这应该非常快,因为此代码在纯C中运行(map()并且__add__()都直接在C中实现):
a = [1.0,2.0,3.0]
b = [4.0,5.0,6.0]
c = map(float.__add__, a, b)
Run Code Online (Sandbox Code Playgroud)
或者,如果您不知道列表中的类型:
import operator
c = map(operator.add, a, b)
Run Code Online (Sandbox Code Playgroud)
Ric*_*dle 12
这个怎么样:
a = [x+y for x,y in zip(a,b)]
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意使用外部库(和固定长度数组),请使用numpy,它具有"+ ="和相关操作以进行就地操作.
import numpy as np
a = np.array([0, 1, 2])
b = np.array([3, 4, 5])
a += b
Run Code Online (Sandbox Code Playgroud)