2013-04-18 167 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'] 

也放到了你再是有效的字符(如空格/标点符号/其他)

相关问题