元素添加2个列表?

Sib*_*ing 221 python list elementwise-operations

我现在有了:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我希望:

[1, 2, 3]
 +  +  +
[4, 5, 6]
|| || ||
[5, 7, 9]
Run Code Online (Sandbox Code Playgroud)

简单地添加两个列表的元素.

我肯定会迭代这两个列表,但我不想这样做.

什么是最Python的方式这样做的?

Ash*_*ary 334

使用mapoperator.add:

>>> from operator import add
>>> list( map(add, list1, list2) )
[5, 7, 9]
Run Code Online (Sandbox Code Playgroud)

或者zip列表理解:

>>> [sum(x) for x in zip(list1, list2)]
[5, 7, 9]
Run Code Online (Sandbox Code Playgroud)

时间比较:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用那些巨大的数组,那么@BasSwinckels的numpy解决方案可能是你应该关注的. (10认同)
  • 注意 - 在python3中,map()返回一个可迭代的东西而不是一个列表.如果你确实需要一个实际的列表,第一个答案就是list(map(add,list1,list2)) (8认同)

Bas*_*els 98

其他人给出了如何在纯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])
Run Code Online (Sandbox Code Playgroud)

进行元素添加现在变得微不足道了

In [4]: sum_vector = vector1 + vector2
In [5]: print sum_vector
[5 7 9]
Run Code Online (Sandbox Code Playgroud)

就像在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
Run Code Online (Sandbox Code Playgroud)

所以这是一个快25倍的因素!但请根据您的情况使用.对于一个简单的程序,你可能不想安装numpy,所以使用标准的python(我发现Henry的版本是最pythonic的).如果你正在进行严重的数字运算,那就让numpy重物进行.对于速度怪胎:似乎numpy解决方案更快开始n = 8.


Hen*_*all 55

[a + b for a, b in zip(list1, list2)]
Run Code Online (Sandbox Code Playgroud)

  • @deltab接受的答案更快,它包含这个答案(更多信息) (4认同)
  • @perfectionm1ng或多或少(尽管它是在我编辑后添加的:).就个人而言,我更喜欢带有显式元组解包的a + b表示法,以提高可读性和pythonicness. (4认同)
  • @ perfectionm1ng虽然我理解你的观点(并且不要吝啬一点)我只是觉得值得指出我总是使用我提出的解决方案(因为它要求它不需要进口可以说是最简单的,以及可以说是更加pythonic),或速度很重要的地方,[Bas Swinckel](http://stackoverflow.com/a/18713494/709852)的答案,这绝对是速度重要的正确选择. (2认同)

Ral*_*alf 11

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

随着Numpy

x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y
Run Code Online (Sandbox Code Playgroud)

2.内置插件

2.1 Lambda

list1=[1, 2, 3]
list2=[4, 5, 6]
print map(lambda x,y:x+y, list1, list2)
Run Code Online (Sandbox Code Playgroud)

请注意,map()支持多个参数.

2.2拉链和列表理解

list1=[1, 2, 3]
list2=[4, 5, 6]
print [x + y for x, y in zip(list1, list2)]
Run Code Online (Sandbox Code Playgroud)


Lud*_*hou 8

numpy我认为使用起来更简单:

import numpy as np
list1=[1,2,3]
list2=[4,5,6]
np.add(list1,list2)
Run Code Online (Sandbox Code Playgroud)

结果:

终端执行

有关详细的参数信息,请在此处检查:numpy.add


Win*_*ing 8

如果您有未知数量的列表,并且没有导入任何内容,那么这可能是 pythonic 并且稍微有用。

只要列表长度相同,就可以使用以下函数。

这里 *args 接受可变数量的列表参数(但只对每个中相同数量的元素求和)。

在返回的列表中再次使用 * 来解压每个列表中的元素。

def sum_lists(*args):
    return list(map(sum, zip(*args)))

a = [1,2,3]
b = [1,2,3]  

sum_lists(a,b)
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 4, 6]
Run Code Online (Sandbox Code Playgroud)

或者有 3 个列表

sum_lists([5,5,5,5,5], [10,10,10,10,10], [4,4,4,4,4])
Run Code Online (Sandbox Code Playgroud)

输出:

[19, 19, 19, 19, 19]
Run Code Online (Sandbox Code Playgroud)


jjs*_*jst 6

如果您需要处理不同大小的列表,不用担心!精彩的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]
>>>
Run Code Online (Sandbox Code Playgroud)

在 Python 2 中,zip_longest称为izip_longest.

另请参阅此相关答案和对另一个问题的评论


Edu*_*lio 6

这很简单 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])
Run Code Online (Sandbox Code Playgroud)

在这里查看文档

如果要接收python列表:

result.tolist()
Run Code Online (Sandbox Code Playgroud)


Fre*_*ell 5

也许“最蟒蛇的方式”应该包括处理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)
Run Code Online (Sandbox Code Playgroud)

如果这在您的问题中起作用,您可能想要哪个结果?


lit*_*nce 5

这适用于 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]
Run Code Online (Sandbox Code Playgroud)


小智 5

[list1[i] + list2[i] for i in range(len(list1))]
Run Code Online (Sandbox Code Playgroud)

  • 更多的Python风格是“[a + b for (a, b) in zip(list1, list2)]” (2认同)
  • @rayryeng 或者不带括号:`[a + b for a, b in zip(list1, list2)]` (2认同)