2011-11-19 8 views
7

Я не могу понять, как сделать функцию в Python, который можно вычислить следующим образом:Как вычесть два списка в Python

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

и результат должен быть новый список, который вычитает List2 из List1, List3=[0,-2,4] ! Я знаю, что мне как-то придется использовать zip-функцию. Делая это, я получаю: ([(3,3), (5,7), (6,2)]), но я не знаю, что теперь делать?

ответ

15

Попробуйте это:

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

Это использует zip, списочные и деструктурирующий.

+0

Мне нравится этот способ сделать это .. Я просто не могу заставить его работать (I гавань» t работал на питоне очень долго)! Я сделал это: def отличия (xs, ys): [x1-x2 for (x1, x2) в zip (xs, ys)]? –

+0

Я использовал [np.subtract (x1, x2) для (x1, x2) в zip (List1, List2)], и он сработал! – Alex

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

EDIT: Как было предложено @Cat ниже, было бы лучше использовать operator.sub() функцию с imap():

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

'operator.sub' более общий, чем' int .__ sub__'. И имеет меньше подчеркиваний. –

+0

@CatPlusPlus +1 для 'operator' – starrify

+0

@CatPlusPlus отличное предложение. Я добавил его к ответу. – brandizzi

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] 

Сложение: Просто проверьте python reference of map и вы увидите, вы могли бы передать более одного Iterable к map

+2

Я не знал, что 'map()' принимает более одного итерабельного. Отлично! – brandizzi

9

Это решение использует 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] 
0

Вы можете сделать это следующим образом

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]

Смежные вопросы