web-dev-qa-db-fra.com

Comment soustraire deux listes de python

Je ne peux pas comprendre comment faire une fonction python qui peut calculer ceci:

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

et le résultat devrait être une nouvelle liste qui soustraite List2 de List1, List3=[0,-2,4]! Je sais que je dois en quelque sorte utiliser la fonction zip. En faisant que je reçois: ([(3,3), (5,7), (6,2)]), mais je ne sais pas quoi faire maintenant?

13
Linus Svendsson

Essaye ça:

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

Cela utilise Zip, des compréhensions de liste et destructurants.

21
Matt Fenwick

Vous pouvez utiliser compréhension de la liste , comme @matt suggéré. Vous pouvez également utiliser iTertools - plus spécifiquement, la fonction imap() fonction:

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

Comme tous les funcitons iTertools, imap() Retourne un itérateur. Vous pouvez générer une liste qui le passe comme paramètre pour le constructeur list():

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

[~ # ~] Edit [~ # ~]: Comme suggéré par @cat ci-dessous, il serait préférable d'utiliser la fonction operator.sub() avec imap():

>>> from operator import sub
>>> list(imap(sub, a, b))
[0, -2, 4]
6
brandizzi

Encore une autre solution ci-dessous:

>>> 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: Vérifiez simplement la référence Python de map et vous verrez que vous pourriez passer plus que un iTable à map

3
starrify

Vous pouvez le faire de la manière suivante

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

cette sortie [0, -2, 4]

1