2015-05-25 13 views
6

Có tùy chọn cách lọc các chuỗi đó khỏi danh sách chuỗi có chứa ví dụ 3 ký tự bằng nhau không? Tôi đã tạo ra một phương pháp có thể làm điều đó nhưng tôi tò mò liệu có cách nào hay hơn hoặc hiệu quả hơn hay đơn giản hơn để làm điều đó.Chuỗi bộ lọc trong đó có n ký tự bằng nhau trong một hàng

list_of_strings = [] 


def check_3_in_row(string): 
    for ch in set(string): 
     if ch*3 in string: 
      return True 
    return False 

new_list = [x for x in list_of_strings if check_3_in_row(x)] 

EDIT: Tôi vừa phát hiện ra một giải pháp:

new_list = [x for x in set(keywords) if any(ch*3 in x for ch in x)] 

Nhưng tôi không chắc chắn đó là cách nhanh hơn - regexp hoặc này.

+0

Liên quan: [sử dụng lại để tìm các ký tự liên tục lặp lại] (http://stackoverflow.com/questions/7147796/python-use-re-to-find-consecutively-repeated-chars) –

Trả lời

6

Bạn có thể sử dụng Regular Expression, như thế này

>>> list_of_strings = ["aaa", "dasdas", "aaafff", "afff", "abbbc"] 
>>> [x for x in list_of_strings if re.search(r'(.)\1{2}', x)] 
['aaa', 'aaafff', 'afff', 'abbbc'] 

Ở đây, . phù hợp với bất kỳ ký tự và nó được thể hiện trong một nhóm ((.)). Và chúng tôi kiểm tra xem nhân vật có cùng một ký tự (chúng tôi sử dụng backreference \1 tham chiếu nhóm được bắt đầu đầu tiên trong chuỗi) xuất hiện hai lần nữa ({2} có nghĩa là hai lần).

+0

Cảm ơn câu trả lời. Giải pháp tốt. Tôi đã phát hiện ra một cách - tôi đã chỉnh sửa bài đăng của mình. –

+0

@Milan Bạn có thể sử dụng mô-đun 'timeit' để kiểm tra. Nhưng phiên bản RegEx có thể tốt hơn phiên bản 'any' của bạn. – thefourtheye

+0

_guess_ của tôi là regex sẽ nhanh hơn nếu các chuỗi dài, vì nó chỉ quét qua từng chuỗi một lần, trong khi phương thức 'any()' quét chuỗi _n_ độ dài _n_ lần. OTOH, nếu hầu hết các chuỗi trong danh sách _do_ chứa một nhóm 3 và nhóm đó có xu hướng xuất hiện gần đầu chuỗi, thì phương thức 'any()' _might_ sẽ nhanh hơn. –

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