如何在python中减去两个列表

Lin*_*son 13 python zip list subtraction

我无法弄清楚如何在python中创建一个可以计算它的函数:

List1=[3,5,6]
List2=[3,7,2]
Run Code Online (Sandbox Code Playgroud)

其结果应该是substracts从列表1列表2一个新的列表,List3=[0,-2,4]!我知道,我不得不使用zip功能.通过这样做,我得到: ([(3,3), (5,7), (6,2)]),但我现在不知道该怎么办?

Mat*_*ick 21

试试这个:

[x1 - x2 for (x1, x2) in zip(List1, List2)]
Run Code Online (Sandbox Code Playgroud)

这使用zip,列表推导和解构.


mac*_*mac 11

这个解决方案使用numpy.它只对大型列表有意义,因为实例化numpy数组会有一些开销.OTOH,除了短名单之外的任何东西,这都会非常快.

>>> import numpy as np
>>> a = [3,5,6]
>>> b = [3,7,2]
>>> list(np.array(a) - np.array(b))
[0, -2, 4]
Run Code Online (Sandbox Code Playgroud)


bra*_*zzi 6

你可以使用列表理解,就像@Matt建议的那样.你也可以使用itertools - 更具体地说,imap()函数:

>>> from itertools import imap
>>> from operator import sub
>>> a = [3,5,6]
>>> b = [3,7,2]
>>> imap(int.__sub__, a, b)
<itertools.imap object at 0x50e1b0>
>>> for i in imap(int.__sub__, a, b):
...     print i
... 
0
-2
4
Run Code Online (Sandbox Code Playgroud)

像所有itertools imap()函数一样,返回一个迭代器.您可以生成一个列表,将其作为list()构造函数的参数传递:

>>> list(imap(int.__sub__, a, b))
[0, -2, 4]
>>> list(imap(lambda m, n: m-n, a, b)) # Using lambda
[0, -2, 4]
Run Code Online (Sandbox Code Playgroud)

编辑:正如下面@Cat所建议的那样,最好使用以下operator.sub()函数imap():

>>> from operator import sub
>>> list(imap(sub, a, b))
[0, -2, 4]
Run Code Online (Sandbox Code Playgroud)

  • `operator.sub`比`int .__ sub__`更通用.而且有较少的下划线. (4认同)

sta*_*ify 5

下面还有一个解决方案:

>>> a = [3,5,6]
>>> b = [3,7,2]
>>> list(map(int.__sub__, a, b)) # for python3.x
[0, -2, 4]
>>> map(int.__sub__, a, b) # and for python2.x
[0, -2, 4]
Run Code Online (Sandbox Code Playgroud)

ADDITION:只需检查python 引用,map你就会发现你可以传递多个迭代到map

  • 我不知道 `map()` 接受多个可迭代对象。这很棒! (2认同)