我经常添加Python列表。
示例:我有两个这样的列表:
a = [0.0, 1.0, 2.0]
b = [3.0, 4.0, 5.0]
我现在想要将a添加到a以获得结果a = [3.0, 5.0, 7.0]
。
通常我最终会这样做:
a[0] += b[0]
a[1] += b[1]
a[2] += b[2]
是否有一些有效的,标准的方法来减少打字?
更新:可以假设列表长度为3并包含浮点数。
答案 0 :(得分:36)
如果您需要有效的矢量运算,请尝试Numpy。
>>> import numpy
>>> a=numpy.array([0,1,2])
>>> b=numpy.array([3,4,5])
>>> a+b
array([3, 5, 7])
>>>
或者(谢谢,Andrew Jaffe),
>>> a += b
>>> a
array([3, 5, 7])
>>>
答案 1 :(得分:33)
我认为你不会找到比问题中提出的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]
编辑:你也可以使用itertools的izip,zip的生成器版本
In [5]: from itertools import izip
In [6]: map(sum, izip(a,b))
Out[6]: [3, 5, 7]
答案 2 :(得分:31)
虽然数字非常好,而列表理解解决方案如果你真的想要创建一个新列表,我很惊讶没有人建议“一个明显的方法” - 一个简单的for
循环!最好:
for i, bi in enumerate(b): a[i] += bi
还行,有点候选:
for i in xrange(len(a)): a[i] += b[i]
答案 3 :(得分:17)
如果您认为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)
或者,如果您不知道列表中的类型:
import operator
c = map(operator.add, a, b)
答案 4 :(得分:11)
这个怎么样:
a = [x+y for x,y in zip(a,b)]
答案 5 :(得分:6)
或者,如果您愿意使用外部库(以及固定长度数组),请使用numpy,其中包含“+ =”和相关操作以进行就地操作。
import numpy as np
a = np.array([0, 1, 2])
b = np.array([3, 4, 5])
a += b
答案 6 :(得分:3)
[a [x] + b [x] for x in range(0,len(a))]
答案 7 :(得分:2)
对于拥有列表列表的一般情况,您可以执行以下操作:
In [2]: import numpy as np
In [3]: a = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3],[4, 5, 6]])
In [4]: [sum(a[:,i]) for i in xrange(len(a[0]))]
Out[4]: [10, 11, 12]
答案 8 :(得分:1)
如果你简明扼要,试试......
vectors = [[0.0, 1.0, 2.0],[3.0, 4.0, 5.0]]
[sum(col) for col in zip(*vectors)]
虽然我不能代表这一点的表现。
答案 9 :(得分:1)
list(map(lambda x:x[0]+x[1], zip(a,b)))
答案 10 :(得分:0)
你可以创建一个函数来获取数组的大小,循环遍历它并创建一个它返回的返回数组。
答案 11 :(得分:0)
理解列表的改进(减少内存消耗)
导入itertools a = [x + y代表x,y代表itertools.izip(a,b)]
实际上如果你不确定a会消耗掉那么我甚至会选择生成器表达式:
(x + y代表x,y代表itertools.izip(a,b))
答案 12 :(得分:0)
a = map(lambda x, y: x + y, a, b)