2013-04-18 3 views

ответ

23

без регулярных выражений:

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

Где вы находите эти полезные полезные функции, как any()? – thavan

+2

@thavan: http://docs.python.org/2/library/functions.html – eumiro

2

Я хотел бы использовать регулярное выражение:

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 
+0

Попробуйте 'filter' версию' isalpha' – jamylak

+0

@jamylak - Обновлено. Это медленнее. – mgilson

+0

wow, что удивительно, должно быть лучше для больших входов, хотя – jamylak

0

Try:

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

Откуда у вас этот предопределенный набор символов? – jamylak

6

Я считаю, используя isalpha() самый элегантный, но он также будет удалите элементы, которые другие неалфавитные символы:

Возвращает true, если все символы в строке являются алфавитами и есть хотя бы один символ, в противном случае - false. Буквенные символы являются символами, определенными в базе данных символов Unicode в «Письме»

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

Он хочет удалить строки с числами, но специальные символы (пробелы, знаки препинания, ...), вероятно, разрешены. – eumiro

+0

За исключением того, что это не будет работать для пунктуации – jamylak

+0

Это правильно. Я все еще думал, что включу его, потому что он * будет * работать для многих сценариев. – Adam

0

Sure, используйте строку предопределённую для цифр, и проверить наличие в них. Мы получим немного фантазии и просто испытаем правдивость в понимании списка; если он вернет что-нибудь, в строке будут цифры.

Итак:

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

И еще одно небольшое изменение:

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

И поставить символы, допустимые в вашем ре (например, пробелы/знаки препинания/другие)

Смежные вопросы