按元素添加 2 个列表?

新手上路,请多包涵

我现在有了:

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

我希望有:

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

简单地按元素添加两个列表。

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

这样做 最符合 Pythonic 的方式 是什么?

原文由 Sibbs Gambling 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 229
2 个回答

使用 mapoperator.add

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

zip 具有列表理解:

 >>> [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

原文由 Ashwini Chaudhary 发布,翻译遵循 CC BY-SA 4.0 许可协议

其他人给出了如何在纯 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 最快版本比较的时机:

 In [16]: from operator import add
In [17]: n = 10**5
In [18]: vector2 = np.tile([4,5,6], n)
In [19]: vector1 = np.tile([1,2,3], n)
In [20]: list1 = [1,2,3]*n
In [21]: list2 = [4,5,6]*n
In [22]: timeit map(add, list1, list2)
10 loops, best of 3: 26.9 ms per loop

In [23]: timeit vector1 + vector2
1000 loops, best of 3: 1.06 ms per loop

所以这快了 25 倍!但是使用适合您情况的东西。对于一个简单的程序,您可能不想安装 numpy,因此请使用标准 python(我发现 Henry 的版本 是最 Pythonic 的)。如果您正在认真处理数字,让 numpy 完成繁重的工作。对于速度怪胎:似乎 numpy 解决方案从 n = 8 开始更快。

原文由 Bas Swinckels 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题