2017-03-16 73 views
4

假設我有兩個不同長度的列表。Python中的列表減法

a = [8,9,4,7,5,6,1,4,8] 
b = [6,4,7,1,5,8,3,6,4,4] 

我希望像這樣的列表:

c= a-b 

#output = [2, 5, -3, 6, 0, -2, -2, -2, 4] 

我怎麼能做到這一點?我試過operator.sub帶地圖功能。但是由於列表的長度不同,我得到一個錯誤。

c = map(operator.sub, a, b) 

TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'

+0

'a-b'直到長度相等......在長度匹配後結束什麼? a-a還是什麼? –

+1

['zip'函數](https://docs.python.org/3/library/functions.html#zip)將停在最短的一個。 – Ryan

+0

我刪除了熊貓和numpy標籤,因爲問題和接受的答案只是使用列表。 – hpaulj

回答

4
from itertools import starmap 
from operator import sub 

a = [8,9,4,7,5,6,1,4,8] 
b = [6,4,7,1,5,8,3,6,4,4] 

output = list(starmap(sub, zip(a, b))) 

如果你不想使用列表理解,這是可以做到與itertools.starmap

你也可以使用地圖,但我認爲starmap是更好的選擇。使用map可以使用嵌套zip來縮短較長的參數。

output = map(sub, *zip(*zip(a, b))) 
print(list(output)) 
# [2, 5, -3, 6, 0, -2, -2, -2, 4] 
7

您可以使用zip列表理解表達沿爲:

>>> a = [8,9,4,7,5,6,1,4,8] 
>>> b = [6,4,7,1,5,8,3,6,4,4] 

>>> [x - y for x, y in zip(a, b)] 
[2, 5, -3, 6, 0, -2, -2, -2, 4]