2011-11-19 93 views
7

no puedo encontrar la manera de hacer una función en Python que puede calcular esto:Como restar dos listas en Python

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

y el resultado debería ser una lista nueva que sustrae Lista2 de Lista1, List3=[0,-2,4] ! Sé que de alguna manera tengo que usar la función zip. Al hacer eso obtengo: ([(3,3), (5,7), (6,2)]), pero no sé qué hacer ahora?

Respuesta

15

Prueba esto:

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

Este utiliza zip, listas por comprensión, y desestructuración.

+0

me gusta esta manera de hacerlo .. No puedo conseguir que funcione (no he he estado trabajando en Python durante mucho tiempo)! Lo hice: def diferencias (xs, ys): [x1-x2 para (x1, x2) en zip (xs, ys)]? –

+0

Utilicé [np.subtract (x1, x2) para (x1, x2) en zip (List1, List2)] y funcionó! – Alex

6

Puede usar list comprehension, como se sugirió @Matt. también se puede utilizar itertools - más específicamente, la función 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 

Como todos los funcitons itertools imap(), devuelve un iterador. Puede generar una lista de pasarlo como un parámetro para el constructor list():

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

EDITAR: Según lo sugerido por @Cat a continuación, sería mejor utilizar la función operator.sub() con imap():

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

'operator.sub' es más genérico que' int .__ sub__'. Y tiene menos guiones bajos. –

+0

@CatPlusPlus +1 para 'operator' – starrify

+0

@CatPlusPlus excelente sugerencia. Lo agregué a la respuesta. – brandizzi

3

Sin embargo, otra solución a continuación:

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

ADEMÁS: sólo comprueban la python reference of map y podrá ver que podría pasar más de un iterable a map

+2

No sabía que 'map()' acepta más de un iterable. ¡Esto es genial! – brandizzi

9

Esta solución utiliza numpy. Tiene sentido solo para grandes listas, ya que hay una sobrecarga en instanciar las matrices numpy. OTOH, para cualquier cosa menos listas cortas, esto será tremendamente rápido.

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

Puede hacerlo de la siguiente manera

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

que da salida a [0, -2, 4]