从包含python中的数字的列表中删除字符串

时间:2013-04-18 13:42:23

标签: python

是否有一种简短的方法可以删除包含数字的列表中的所有字符串?

例如

my_list = [ 'hello' , 'hi', '4tim', '342' ]

将返回

my_list = [ 'hello' , 'hi']

6 个答案:

答案 0 :(得分:28)

没有正则表达式:

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

答案 1 :(得分:6)

我发现使用isalpha()最优雅,但它也会删除包含其他非字母字符的项目:

  

如果字符串中的所有字符都是字母并且至少有一个字符,则返回true,否则返回false。字母字符是Unicode字符数据库中定义为“Letter”

的字符
my_list = [item for item in my_list if item.isalpha()]

答案 2 :(得分:4)

我使用正则表达式:

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

答案 3 :(得分:0)

尝试:

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

答案 4 :(得分:0)

当然,使用内置的数字字符串,并测试它们的存在。 我们会有点花哨,只是在列表理解中测试真实性;如果它返回任何字符串中的数字。

所以:

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

答案 5 :(得分:0)

另一个微小的变化:

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

并在你的re中放置有效的字符(例如空格/标点/其他)