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

Remove strings from a list that contains numbers in python

本问题已经有最佳答案,请猛点这里访问。

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

例如

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

会回来的

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


不带regex:

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


我发现使用EDOCX1[1]是最优雅的,但它也会删除包含其他非字母字符的项目:

Return true if all characters in the string are alphabetic and there is at least one character, false otherwise. Alphabetic characters are those characters defined in the Unicode character database as"Letter"

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


我会用一个正则表达式:

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

在时间方面,在示例数据上使用regex比isdigit解决方案快得多。诚然,它比isalpha慢,但其行为与标点符号、空格等稍有不同。由于问题没有指定这些字符串应该发生什么,因此不清楚哪一个是最佳解决方案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)

以下是我的结果:

1
2
3
4
isalpha 1.80665302277
fisalpha 2.09064006805
regex 2.98224401474
isdigit 8.0824341774


还有一个微小的变化:

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

并在RE中输入有效字符(如空格/标点/其他)


当然,使用数字的字符串内置,并测试它们的存在性。我们将得到一点幻想,只是在列表理解中测试真实性;如果它返回任何东西,那么字符串中就有数字。

所以:

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


尝试:

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