2013-04-18 35 views

Trả lời

23

Nếu không có regex:

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

nơi nào bạn tìm thấy các chức năng hữu ích này như bất kỳ()? – thavan

+2

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

2

Tôi muốn sử dụng một regex:

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

Xét về thời gian, sử dụng một regex là nhanh hơn đáng kể trên mẫu của bạn dữ liệu hơn giải pháp isdigit. Phải thừa nhận rằng, nó chậm hơn isalpha, nhưng hành vi hơi khác với dấu chấm câu, khoảng trống, v.v. Vì vấn đề không chỉ rõ điều gì sẽ xảy ra với các chuỗi đó, nên không rõ giải pháp nào là tốt nhất.

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) 

Dưới đây là kết quả của tôi:

isalpha 1.80665302277 
fisalpha 2.09064006805 
regex 2.98224401474 
isdigit 8.0824341774 
+0

Thử phiên bản 'filter' của' isalpha' – jamylak

+0

@jamylak - Cập nhật. Nó chậm hơn. – mgilson

+0

wow thật đáng ngạc nhiên, nó phải tốt hơn cho các đầu vào lớn hơn mặc dù – jamylak

0

Hãy thử:

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

Bạn đã nhận được bộ ký tự được xác định trước này ở đâu? – jamylak

6

Tôi thấy sử dụng isalpha() thanh lịch nhất, nhưng nó cũng sẽ xóa các mục con tain các ký tự không phải chữ cái khác:

Trả về true nếu tất cả các ký tự trong chuỗi là chữ cái và có ít nhất một ký tự, sai khác. ký tự chữ là những nhân vật được định nghĩa trong cơ sở dữ liệu ký tự Unicode là “Letter”

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

Anh ấy muốn xóa các chuỗi có số, nhưng các ký tự đặc biệt (dấu cách, dấu câu, ...) có thể được cho phép. – eumiro

+0

Ngoại trừ nó sẽ không hoạt động cho dấu chấm câu – jamylak

+0

Đúng vậy. Tôi vẫn nghĩ rằng tôi sẽ bao gồm nó bởi vì nó * sẽ * làm việc cho nhiều kịch bản. – Adam

0

Chắc chắn, sử dụng chuỗi BUILTIN cho chữ số, và kiểm tra sự tồn tại của chúng. Chúng tôi sẽ có được một chút lạ mắt và chỉ cần kiểm tra sự thật trong danh sách hiểu; nếu nó trả lại bất cứ điều gì có chữ số trong chuỗi.

Vì vậy:

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

Tuy nhiên sự thay đổi khác nhẹ:

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

Và đưa các ký tự có giá trị trong tái của bạn (như dấu cách/chấm câu/khác)

Các vấn đề liên quan