2011-11-19 14 views
7

nie mogę dowiedzieć się, jak zrobić funkcję w Pythonie, które można obliczyć tak:Jak odjąć dwie listy w python

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

a wynik powinien być nowa lista, która odejmuje lista2 z List1, List3=[0,-2,4] ! Wiem, że w jakiś sposób muszę użyć funkcji zip. Robiąc to dostaję: ([(3,3), (5,7), (6,2)]), ale nie wiem co teraz zrobić?

Odpowiedz

15

Spróbuj tego:

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

używa zip, listowych i rozpad.

+0

Lubię ten sposób to zrobić .. Po prostu nie mogę zmusić go do pracy (I haven” pracowałem w Pythonie przez bardzo długi czas)! Zrobiłem to: różnice def (xs, ys): [x1-x2 dla (x1, x2) w zip (xs, ys)]? –

+0

Użyłem [np.subtract (x1, x2) dla (x1, x2) w zip (List1, List2)] i zadziałało! – Alex

6

Możesz użyć list comprehension, jak zasugerował @Matt. można również użyć itertools - dokładniej, imap() funkcję:

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

Jak każdy itertools funcitons, imap() zwraca iterator. Można wygenerować listę przepuszczenie go jako parametr do konstruktora 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: Jak sugeruje @Cat poniżej, byłoby lepiej, aby korzystać z funkcji operator.sub() z imap():

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

'operator.sub' jest bardziej ogólny niż' int .__ sub__'. I ma mniej podkreśleń. –

+0

@CatPlusPlus +1 dla 'operatora' – starrify

+0

@CatPlusPlus doskonała sugestia. Dodałem go do odpowiedzi. – brandizzi

3

Jeszcze innym rozwiązaniem poniżej:

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

Ponadto: Wystarczy sprawdzić na python reference of map a zobaczysz można przekazać więcej niż jeden iterowalny do map

+2

Nie wiedziałem, że 'map()' akceptuje więcej niż jeden iterable. To jest świetne! – brandizzi

9

Rozwiązanie to wykorzystuje numpy. Ma to sens tylko w przypadku dużych list, ponieważ istnieje pewien narzut w tworzeniu instancji numpy. OTOH, na wszystko oprócz krótkich listów, będzie niesamowicie szybki.

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

Można to zrobić w następujący sposób

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

że wyprowadza [0, -2, 4]