2010-10-15 38 views
8

Tôi có các chuỗi giống như ví dụ này: "AAABBBCDEEEEBBBAA"Làm thế nào để tách chuỗi này bằng python?

Mọi ký tự đều có thể có trong chuỗi.

Tôi muốn chia nó vào một danh sách như: [ 'AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

như vậy mỗi liên tục kéo dài của cùng một ký tự đi đến phần tử riêng biệt của danh sách chia nhỏ.

Tôi biết rằng tôi có thể lặp qua các ký tự trong chuỗi, kiểm tra từng cặp i và i-1 nếu chúng chứa cùng một ký tự, v.v ... nhưng có giải pháp đơn giản hơn không?

Trả lời

9
>>> from itertools import groupby 
>>> [''.join(g) for k, g in groupby('AAAABBBCCD')] 
['AAAA', 'BBB', 'CC', 'D'] 

Và bởi chuỗi thao tác bình thường

>>> a=[];S="";p="" 
>>> s 
'AAABBBCDEEEEBBBAA' 
>>> for c in s: 
...  if c != p: a.append(S);S="" 
...  S=S+c 
...  p=c 
... 
>>> a.append(S) 
>>> a 
['', 'AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA'] 
>>> filter(None,a) 
['AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA'] 
15

Chúng ta có thể sử dụng Regex:

>>> import re 
>>> r = re.compile(r'(.)\1*') 
>>> [m.group() for m in r.finditer('AAABBBCDEEEEBBBAA')] 
['AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA'] 

Ngoài ra, chúng ta có thể sử dụng itertools.groupby.

>>> import itertools 
>>> [''.join(g) for k, g in itertools.groupby('AAABBBCDEEEEBBBAA')] 
['AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA'] 

timeit lãm Regex là nhanh hơn (cho chuỗi này cụ thể) (Python 2.6, Python 3.1). Nhưng Regex là sau khi tất cả các chuyên ngành cho chuỗi, và groupby là một chức năng chung chung, vì vậy đây không phải là quá bất ngờ.

+0

Wow, cảm ơn, giải pháp regex là mát mẻ, groupby quá, làm thế nào là có thể là tôi dành quá nhiều thời gian cho vấn đề này trước khi gửi câu hỏi đến stackoverflow và nhận được câu trả lời trong 5 phút ;-) – jan

+0

+1 để sử dụng regexp để giải quyết một vấn đề mà regexp là cho :) – Kimvais

3
import itertools 
s = "AAABBBCDEEEEBBBAA" 
["".join(chars) for _, chars in itertools.groupby(s)] 
0

Chỉ cần một cách khác để soloving vấn đề của bạn:

#!/usr/bin/python 

string = 'AAABBBCDEEEEBBBAA' 
memory = str() 
List = list() 
for index, element in enumerate(string): 
    if index > 0: 
     if string[index] == string[index - 1]: 
      memory += string[index] 
     else: 
      List.append(memory) 
      memory = element 
    else: 
     memory += element 

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