23

我不知道如何在 python 中创建一个可以计算这个的函数:

List1=[3,5,6]
List2=[3,7,2]

结果应该是一个从 List1 中减去 List2 的新列表,List3=[0,-2,4]!我知道,我必须以某种方式使用 zip 功能。通过这样做,我得到: ([(3,3), (5,7), (6,2)]),但我不知道现在该怎么办?

4

5 回答 5

37

尝试这个:

[x1 - x2 for (x1, x2) in zip(List1, List2)]

这使用zip、列表推导和解构。

于 2011-11-19T12:54:10.767 回答
18

此解决方案使用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]
于 2011-11-19T14:11:13.843 回答
6

正如@Matt 建议的那样,您可以使用list comprehension 。您还可以使用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]
于 2011-11-19T13:09:26.100 回答
6

下面还有另一个解决方案:

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

补充:只需检查python 参考,map你会发现你可以将多个可迭代传递给map

于 2011-11-19T13:15:53.900 回答
1

您可以通过以下方式进行

List1 = [3,5,6]
List2 = [3,7,2]
ans = [List1[i]-List2[i] for i in range(min(len(List1), len(List2)))]
print ans

输出[0, -2, 4]

于 2016-06-02T17:54:17.323 回答