2011-12-06 86 views
0

想象一下,有隨機的單詞列表:從列表中刪除所有但某些詞(如白名單)

words = ['elephant', 'dog', 'blue', 'sam', 'white', 'red', 'sun', 'moon'] 

而且我要刪除所有,但下面的話(如白名單):

colors = ['red', 'green', 'blue', 'orange', 'white'] 

我想產生下面的列表(順序事項):

filtered = ['blue', 'white', 'red'] 

我想過這樣的事情(W這工作很好):

filtered = filter (lambda a: a == 'red' or a == 'green' or a == 'blue' or a == 'orange' or a == 'white', words) 

但這是真的最好/最有效的方式?

回答

4

如果你想維持秩序,有效地過濾掉非顏色,創建顏色set,使in檢查速度更快,那麼你可以去通所有單詞並過濾掉非顏色

words = ['elephant', 'dog', 'blue', 'sam', 'white', 'red', 'sun', 'moon'] 
colors = set(['red', 'green', 'blue', 'orange', 'white']) 
print [word for word in words if word in colors] 

輸出:

['blue', 'white', 'red'] 
1
filtered = filter(lambda a: a in whitelis, words) 

應該做的伎倆

這也可以寫成一個列表理解

filtered = [x for x in letters if x in whitelist] 

如下所述,您可以使用集類型,以確保在白名單中的每一個字是獨特的。當你的白名單沒有被硬編碼時,這很有用,但是不知何故,例如從數據庫中的記錄中生成。

1

使用設置操作:

words = ['elephant', 'dog', 'blue', 'sam', 'white', 'red', 'sun', 'moon'] 
colors = ['red', 'green', 'blue', 'orange', 'white'] 
filtered = set(words).difference(colors) 
+0

這種方法使得兩個關鍵假設:1),要麼在'words'名單沒有按不包含重複項,或者不需要保留,2)「過濾」順序無關緊要。 –

+0

這是一個有效的觀察 –

2
words = ['elephant', 'dog', 'blue', 'sam', 'white', 'red', 'sun', 'moon'] 
filterset = frozenset(['red', 'green', 'blue', 'orange', 'white']) 
filtered = [x for x in words if x in filterset] 

該解決方案的優點是即使對於相對較大的filterset它也會相對較快,並且它不會假定words列表僅包含唯一條目。

您可以將filterset作爲filterlist,但這會損害性能,尤其是在列表很大的情況下。

1

雖然列表理解通常被認爲是更Python,我喜歡的功能filter,如果我們可以把它寫不lambda

>> filter(set(colors).__contains__, words) 
['blue', 'white', 'red'] 
相關問題