Có cách nào ngắn gọn để xóa tất cả các chuỗi trong danh sách có chứa các số không?Xóa chuỗi khỏi danh sách chứa số trong python
Ví dụ
my_list = [ 'hello' , 'hi', '4tim', '342' ]
sẽ trở
my_list = [ 'hello' , 'hi']
Có cách nào ngắn gọn để xóa tất cả các chuỗi trong danh sách có chứa các số không?Xóa chuỗi khỏi danh sách chứa số trong python
Ví dụ
my_list = [ 'hello' , 'hi', '4tim', '342' ]
sẽ trở
my_list = [ 'hello' , 'hi']
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
Hãy thử:
import re
my_list = [x for x in my_list if re.match("^[A-Za-z_-]*$", x)]
Bạn đã nhận được bộ ký tự được xác định trước này ở đâu? – jamylak
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()]
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)
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)
Vâng này thay đổi câu hỏi hoàn toàn – jamylak