2011-11-19 21 views
7

non riesco a capire come fare una funzione in pitone in grado di calcolare questo:Come sottrarre due liste in Python

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

e il risultato dovrebbe essere una nuova lista che sottrae List2 da List1, List3=[0,-2,4] ! Lo so, che in qualche modo devo usare la funzione zip. In questo modo ottengo: ([(3,3), (5,7), (6,2)]), ma non so cosa fare ora?

risposta

15

Prova questo:

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

Questo utilizza zip, list comprehension, e destrutturazione.

+0

mi piace questo modo di farlo .. non riesco proprio a farlo funzionare (Mi rifugio' Ho lavorato in Python per un tempo molto lungo)! Ho fatto questo: differenze di def (xs, ys): [x1-x2 per (x1, x2) in zip (xs, ys)]? –

+0

Ho usato [np.subtract (x1, x2) per (x1, x2) in zip (Lista1, Lista2)] e ha funzionato! – Alex

6

È possibile utilizzare list comprehension, come suggerito da @Matt. è anche possibile utilizzare itertools - più specificamente, la funzione 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 

Come tutti itertools funcitons, imap() restituisce un iteratore. È possibile generare un elenco di passarlo come parametro per il costruttore di 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: Come suggerito da @Cat di sotto, sarebbe meglio utilizzare la funzione operator.sub() con imap():

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

'operator.sub' è più generico di' int .__ sub__'. E ha meno underscore. –

+0

@CatPlusPlus +1 per 'operator' – starrify

+0

@CatPlusPlus eccellente suggerimento. L'ho aggiunto alla risposta. – brandizzi

3

ancora un'altra soluzione qui di seguito:

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

AGGIUNTA: Basta controllare per la python reference of map e vedrete si poteva passare più di un iterabile per map

+2

Non sapevo che 'map()' accetta più di un iterabile. È fantastico! – brandizzi

9

Questa soluzione utilizza numpy. Ha senso solo per elenchi di grandi dimensioni in quanto vi è un sovraccarico in istanziare gli array numpy. OTOH, per tutto tranne liste brevi, sarà incredibilmente veloce.

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

Lo si può fare in questo modo

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

che emette [0, -2, 4]