2015-05-04 91 views
0

我有兩個列表,如下面的例子(實際上,a更長),我想刪除所有常見元素,在這種情況下,列表punctuation中給出的標點符號。如何從兩個列表中刪除公共元素?

a = [['A', 'man,', 'view,', 'becomes', 'mankind', ';', 'mankind', 'member', 'comical', 'family', 'Intelligences', '.'],['Jeans', 'lengthen', 'legs', ',', 'hug', 'hips', ',', 'turn', 'heads', '.']] 
punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"] 
+0

#2是一個社區,在這裏您發佈一些代碼或東西,你有試過,到目前爲止你嘗試過什麼?我們很樂意提供幫助,但您有什麼嘗試? –

回答

0

你可以這樣做:

>>> from itertools import chain 
>>> filter(lambda e: e not in punctuation, chain(*a)) 
['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences', 'Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads'] 

或者,如果你想保持你的子表結構:

>>> [filter(lambda e: e not in punctuation, sub) for sub in a] 
[['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences'], ['Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']] 
0

當順序並不重要:

你可以在上面做一個set()操作,但是首先你要壓平嵌套列表a(從Making a flat list out of list of lists in Python拍攝):

b = [item for sublist in a for item in sublist] 
cleaned = list(set(b) - set(punctuation)) 

cleaned是一個看起來像['A', 'hug', 'heads', 'family', 'Intelligences', 'becomes', 'Jeans', 'lengthen', 'member', 'turn', 'mankind', 'view,', 'legs', 'man,', 'hips', 'comical']

當順序很重要:

簡單羅列理解,這可能是比較慢

cleaned = [x for x in b if x not in punctuation] 

cleaned看起來像['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences', 'Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']

0

你可以做到這一點,但列表順序可能會改變。

[list(set(sublist)-set(punctuation)) for sublist in a] 

使用集合,您可以刪除標點條目,並將結果再次轉換爲列表。使用列表理解爲列表中的每個子列表執行此操作。


如果保持的順序是非常重要的,你可以這樣做:

[[x for x in sublist if not (x in punctuation)] for sublist in a] 
1

讓一組詞移除和測試遏制逐項的,如果你需要維持秩序。

cleaned = [word for word in words if word not in blacklist] 
相關問題