Есть ли короткий способ удалить все строки в списке, который содержит числа?Удалить строки из списка, содержащего числа в python
Например
my_list = [ 'hello' , 'hi', '4tim', '342' ]
вернется
my_list = [ 'hello' , 'hi']
Есть ли короткий способ удалить все строки в списке, который содержит числа?Удалить строки из списка, содержащего числа в python
Например
my_list = [ 'hello' , 'hi', '4tim', '342' ]
вернется
my_list = [ 'hello' , 'hi']
Я хотел бы использовать регулярное выражение:
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
Try:
import re
my_list = [x for x in my_list if re.match("^[A-Za-z_-]*$", x)]
Откуда у вас этот предопределенный набор символов? – jamylak
Я считаю, используя isalpha()
самый элегантный, но он также будет удалите элементы, которые другие неалфавитные символы:
Возвращает true, если все символы в строке являются алфавитами и есть хотя бы один символ, в противном случае - false. Буквенные символы являются символами, определенными в базе данных символов Unicode в «Письме»
my_list = [item for item in my_list if item.isalpha()]
Он хочет удалить строки с числами, но специальные символы (пробелы, знаки препинания, ...), вероятно, разрешены. – eumiro
За исключением того, что это не будет работать для пунктуации – jamylak
Это правильно. Я все еще думал, что включу его, потому что он * будет * работать для многих сценариев. – Adam
Sure, используйте строку предопределённую для цифр, и проверить наличие в них. Мы получим немного фантазии и просто испытаем правдивость в понимании списка; если он вернет что-нибудь, в строке будут цифры.
Итак:
out_list = []
for item in my_list:
if not [ char for char in item if char in string.digits ]:
out_list.append(item)
И еще одно небольшое изменение:
>>> import re
>>> filter(re.compile('(?i)[a-z]').match, my_list)
['hello', 'hi']
И поставить символы, допустимые в вашем ре (например, пробелы/знаки препинания/другие)
Ну это полностью меняет вопрос – jamylak