我现在有:

list1 = [1, 2, 3]
list2 = [4, 5, 6]

我希望有:

[1, 2, 3]
 +  +  +
[4, 5, 6]
|| || ||
[5, 7, 9]

仅仅是两个列表的元素相加。

我当然可以迭代这两个列表,但我不想这样做。

最python化的方式是什么?


当前回答

虽然,实际的问题并不想遍历列表来生成结果,但是所提出的所有解决方案实际上都是这样做的!

要刷新:如果不查看所有向量元素,就不能将两个向量相加。因此,大多数解的算法复杂度都是大o (n)。其中n是向量的维数。

因此,从算法的角度来看,使用for循环迭代生成结果列表是合乎逻辑的,也是python化的。但是,除此之外,该方法没有调用或导入任何附加库的开销。

# Assumption: The lists are of equal length.
resultList = [list1[i] + list2[i] for i in range(len(list1))]

这里显示/讨论的时间取决于系统和实现,不能作为衡量操作效率的可靠措施。在任何情况下,向量加法运算的大O复杂度是线性的,即O(n)。

其他回答

[list1[i] + list2[i] for i in range(len(list1))]

正如其他人所描述的那样,一个快速且节省空间的解决方案是使用numpy (np)及其内置的矢量操作功能:

1. 与Numpy

x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y

2. 与整体功能

2.1λ

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)]

使用map和operator.add:

>>> from operator import add
>>> list( map(add, list1, list2) )
[5, 7, 9]

或者压缩一个列表理解:

>>> [sum(x) for x in zip(list1, list2)]
[5, 7, 9]

时间比较:

>>> list2 = [4, 5, 6]*10**5
>>> list1 = [1, 2, 3]*10**5
>>> %timeit from operator import add;map(add, list1, list2)
10 loops, best of 3: 44.6 ms per loop
>>> %timeit from itertools import izip; [a + b for a, b in izip(list1, list2)]
10 loops, best of 3: 71 ms per loop
>>> %timeit [a + b for a, b in zip(list1, list2)]
10 loops, best of 3: 112 ms per loop
>>> %timeit from itertools import izip;[sum(x) for x in izip(list1, list2)]
1 loops, best of 3: 139 ms per loop
>>> %timeit [sum(x) for x in zip(list1, list2)]
1 loops, best of 3: 177 ms per loop

虽然,实际的问题并不想遍历列表来生成结果,但是所提出的所有解决方案实际上都是这样做的!

要刷新:如果不查看所有向量元素,就不能将两个向量相加。因此,大多数解的算法复杂度都是大o (n)。其中n是向量的维数。

因此,从算法的角度来看,使用for循环迭代生成结果列表是合乎逻辑的,也是python化的。但是,除此之外,该方法没有调用或导入任何附加库的开销。

# Assumption: The lists are of equal length.
resultList = [list1[i] + list2[i] for i in range(len(list1))]

这里显示/讨论的时间取决于系统和实现,不能作为衡量操作效率的可靠措施。在任何情况下,向量加法运算的大O复杂度是线性的,即O(n)。

如果您需要处理不同大小的列表,不用担心!很棒的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。

参见相关回答,并对另一个问题进行评论。