有没有一种简单的方法可以删除包含数字的列表中的所有字符串?
例如
my_list = [ 'hello' , 'hi', '4tim', '342' ]
会回来
my_list = [ 'hello' , 'hi']
有没有一种简单的方法可以删除包含数字的列表中的所有字符串?
例如
my_list = [ 'hello' , 'hi', '4tim', '342' ]
会回来
my_list = [ 'hello' , 'hi']
没有正则表达式:
[x for x in my_list if not any(c.isdigit() for c in x)]
我发现使用isalpha()
最优雅的,但它也会删除包含其他非字母字符的项目:
如果字符串中的所有字符都是字母并且至少有一个字符,则返回 true,否则返回 false。字母字符是在 Unicode 字符数据库中定义为“字母”的那些字符</p>
my_list = [item for item in my_list if item.isalpha()]
我会使用正则表达式:
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
尝试:
import re
my_list = [x for x in my_list if re.match("^[A-Za-z_-]*$", x)]
还有一个细微的变化:
>>> import re
>>> filter(re.compile('(?i)[a-z]').match, my_list)
['hello', 'hi']
并将有效的字符放在您的 re 中(例如空格/标点符号/其他)
当然,使用内置的字符串作为数字,并测试它们的存在。我们会有点幻想,只是测试列表理解中的真实性;如果它返回任何字符串中的数字。
所以:
out_list = []
for item in my_list:
if not [ char for char in item if char in string.digits ]:
out_list.append(item)