我无法弄清楚如何在python中创建一个可以计算它的函数:
List1=[3,5,6]
List2=[3,7,2]
,结果应该是一个新的列表,它从List1 List3=[0,-2,4]
中减去List2!
我知道,我不得不使用zip功能。通过这样做我得到:
([(3,3), (5,7), (6,2)])
,但我现在不知道该怎么办?
答案 0 :(得分:18)
试试这个:
[x1 - x2 for (x1, x2) in zip(List1, List2)]
这使用zip
,列表推导和解构。
答案 1 :(得分:10)
此解决方案使用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]
答案 2 :(得分:6)
您可以使用list comprehension,正如@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]
答案 3 :(得分:3)
下面的另一个解决方案:
>>> 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]
ADDITION:只需检查python reference of map
,您就会发现可以将多个可迭代传递给map
答案 4 :(得分:1)
您可以通过以下方式执行此操作
List1 = [3,5,6]
List2 = [3,7,2]
ans = [List1[i]-List2[i] for i in xrange(min(len(List1), len(List2)))]
print ans
输出[0, -2, 4]