2009-08-21 49 views
9

我有從包依賴列表中收集的數據。如何從Python列表中篩選項目?

依賴:FOO酒吧巴茲> = 5.2

我結束了

d = set(['foo','bar','baz','>=','5.2']) 

我不希望數字和操作數。

在Perl我會

@new = grep {/^[a-z]+$/} @old 

,但我不能找到一種方法,例如傳遞remove()lambda或其他東西。

我來最接近的是醜陋:

[ item != None for item in [ re.search("^[a-zA-Z]+$",atom) for atom in d] ] 

這讓我地圖,其中值超出設定我要的... 如果設定的順序重複?我知道在Perl哈希中並非如此。

我知道如何迭代。 :)我試圖做到這一點pythonesque正確的方式

+0

看看這篇文章(這是你的問題的反向):http://stackoverflow.com/questions/1112444/perl-equivalent-of-python-list-comprehension/1112462 – Telemachus 2009-08-21 21:33:55

+0

OT評論:用Python測試None的慣用方法是「is」。使用「item is not None」而不是「item!= None」 – 2009-08-22 17:13:06

回答

21

無需這裏正則表達式使用str.isalpha帶和不帶列表理解:。

my_list = ['foo','bar','baz','>=','5.2'] 

# With 
only_words = [token for token in my_list if token.isalpha()] 

# Without 
only_words = filter(str.isalpha, my_list) 

假面lly我不認爲你必須對Python中的所有東西都使用列表理解,但是當我建議mapfilter的答案時,我總是會皺眉。

+0

+1喜歡過濾器()' – RichieHindle 2009-08-21 21:49:37

+1

沒有lambda過濾器是好的-OK – u0b34a0f6ae 2009-08-21 22:35:14

+2

在這個(非常常見的)情況下不使用lambda過濾器是A-OK,只要你不混合str和unicode對象,所有地獄都會打破除此以外。 – Sufian 2009-08-21 23:57:52

1

如何

d = set([item for item in d if re.match("^[a-zA-Z]+$",item)]) 

,給你你想要的值,早在d(順序可能會有所不同,但是這是你的價格支付使用套

+0

match()使「^」無用:re.match(「[a ...」)。 – EOL 2009-08-22 18:27:25