2012-02-29 36 views
8

Tôi muốn chia một chuỗi như:chuỗi Chia thành các chuỗi lặp đi lặp lại các yếu tố

'aaabbccccabbb' 

vào

['aaa', 'bb', 'cccc', 'a', 'bbb'] 

một cách thanh lịch để làm điều này bằng Python là gì? Nếu nó làm cho nó dễ dàng hơn, nó có thể được giả định rằng chuỗi sẽ chỉ chứa một của, b và c.

+0

thể trùng lặp của [Làm thế nào để chia chuỗi này với python?] (Http://stackoverflow.com/questions/3940721/how -to-split-this-string-with-python) –

+1

Không ai đề xuất cụm từ thông dụng? Tôi vừa ấn tượng vừa buồn. –

+0

Vâng, đó là bản sao của câu hỏi mà Ethan đã liên kết. Nhưng câu hỏi đó không có tiêu đề hữu ích, IMO. – Colin

Trả lời

26

Đó là trường hợp sử dụng cho itertools.groupby :)

>>> from itertools import groupby 
>>> s = 'aaabbccccabbb' 
>>> [''.join(y) for _,y in groupby(s)] 
['aaa', 'bb', 'cccc', 'a', 'bbb'] 
+0

Tôi biết có một cách dễ dàng để làm điều này! – Colin

3

Bạn có thể tạo một iterator - mà không cần cố gắng để được thông minh chỉ để giữ cho nó ngắn và không thể đọc:

def yield_same(string): 
    it_str = iter(string) 
    result = it_str.next() 
    for next_chr in it_str: 
     if next_chr != result[0]: 
      yield result 
      result = "" 
     result += next_chr 
    yield result 


.. 
>>> list(yield_same("aaaaaabcbcdcdccccccdddddd")) 
['aaaaaa', 'b', 'c', 'b', 'c', 'd', 'c', 'd', 'cccccc', 'dddddd'] 
>>> 

chỉnh sửa ok, do đó, có itertools.groupby, mà có thể làm một cái gì đó như thế này.

2

Đây là cách tốt nhất mà tôi có thể tìm thấy sử dụng regex:

print [a for a,b in re.findall(r"((\w)\2*)", s)] 
1
>>> import re 
>>> s = 'aaabbccccabbb' 
>>> [m.group() for m in re.finditer(r'(\w)(\1*)',s)] 
['aaa', 'bb', 'cccc', 'a', 'bbb'] 
Các vấn đề liên quan