18

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

例如

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

会回来

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

6 回答 6

37

没有正则表达式:

[x for x in my_list if not any(c.isdigit() for c in x)]
于 2013-04-18T13:45:18.643 回答
7

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

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

my_list = [item for item in my_list if item.isalpha()]
于 2013-04-18T13:46:13.780 回答
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
于 2013-04-18T13:44:36.360 回答
1

尝试:

import re
my_list = [x for x in my_list if re.match("^[A-Za-z_-]*$", x)]
于 2013-04-18T13:45:42.917 回答
0

还有一个细微的变化:

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

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

于 2013-04-18T13:56:19.390 回答
0

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

所以:

out_list = []
for item in my_list:
    if not [ char for char in item if char in string.digits ]:
        out_list.append(item)        
于 2013-04-18T13:47:20.073 回答