如何在Python中相减两个列表
我搞不清楚怎么在Python里写一个函数来计算这个:
List1=[3,5,6]
List2=[3,7,2]
结果应该是一个新的列表,它是把List2从List1中减去,也就是List3=[0,-2,4]
!我知道我得用到zip函数。用这个函数后,我得到了:([(3,3), (5,7), (6,2)])
,但我接下来该怎么做呢?
5 个回答
7
你可以使用列表推导式,就像@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
和所有的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]
编辑: 正如@Cat下面提到的,使用operator.sub()
函数配合imap()
会更好:
>>> from operator import sub
>>> list(imap(sub, a, b))
[0, -2, 4]
21
这个解决方案使用了 numpy 库。对于比较大的列表来说,这个方法是有意义的,因为创建 numpy 数组会有一些额外的开销。不过,对于短列表以外的情况,这个方法会非常快速。
>>> import numpy as np
>>> a = [3,5,6]
>>> b = [3,7,2]
>>> list(np.array(a) - np.array(b))
[0, -2, 4]
40
试试这个:
[x1 - x2 for (x1, x2) in zip(List1, List2)]
这个例子使用了 zip
、列表推导式和解构赋值。