2013-04-18 207 views

回答

23

沒有正則表達式:

[x for x in my_list if not any(c.isdigit() for c in x)] 
+1

你在哪裏可以找到像任何()這樣的其他有用的功能? – thavan

+2

@thavan:http://docs.python.org/2/library/functions.html – eumiro

2

我會使用一個正則表達式:

import re 
my_list = [s for s in my_list if not re.search(r'\d',s)] 

從時間上來說,使用正則表達式顯著更快的是你的樣品數據比isdigit解決方案。無可否認,它比isalpha慢,但其行爲與標點符號,空格等稍有不同。由於問題並未指定這些字符串應該發生什麼,因此不清楚哪個是最佳解決方案。

import re 

my_list = [ 'hello' , 'hi', '4tim', '342' 'adn322' ] 
def isalpha(mylist): 
    return [item for item in mylist if item.isalpha()] 

def fisalpha(mylist): 
    return filter(str.isalpha,mylist) 

def regex(mylist,myregex = re.compile(r'\d')): 
    return [s for s in mylist if not myregex.search(s)] 

def isdigit(mylist): 
    return [x for x in mylist if not any(c.isdigit() for c in x)] 

import timeit 
for func in ('isalpha','fisalpha','regex','isdigit'): 
    print func,timeit.timeit(func+'(my_list)','from __main__ import my_list,'+func) 

這裏是我的結果:

isalpha 1.80665302277 
fisalpha 2.09064006805 
regex 2.98224401474 
isdigit 8.0824341774 
+0

嘗試'isalpha'的過濾器版本 – jamylak

+0

@jamylak - 更新。速度較慢。 – mgilson

+0

哇,這是令人驚訝的,它必須更好的更大的投入,雖然 – jamylak

0

嘗試:

import re 
my_list = [x for x in my_list if re.match("^[A-Za-z_-]*$", x)] 
+0

你從哪裏得到這個預定義的字符集? – jamylak

6

我發現使用isalpha()最優雅的,但它也將刪除連接的項目tain其他非字母字符:

如果字符串中的所有字符都是字母並且至少有一個字符,則返回true,否則返回false。字符都是Unicode字符數據庫中定義爲「信」

my_list = [item for item in my_list if item.isalpha()] 
+1

他希望刪除帶有數字的字符串,但可能允許使用特殊字符(空格,標點符號...)。 – eumiro

+0

除標點符號不起作用外 – jamylak

+0

這是正確的。我仍然認爲我會加入它,因爲它*會*適用於很多情況。 – Adam

0

確保這些字符,請使用內置的數字串,並測試他們的存在。 我們會稍微想一下,只是在列表理解中測試真實性;如果它返回任何字符串中的數字。

所以:

out_list = [] 
for item in my_list: 
    if not [ char for char in item if char in string.digits ]: 
     out_list.append(item)   
0

而另一個微小的變化:

>>> import re 
>>> filter(re.compile('(?i)[a-z]').match, my_list) 
['hello', 'hi'] 

也放到了你再是有效的字符(如空格/標點符號/其他)

相關問題