2012-02-29 19 views
8

Quiero dividir una cadena como la repetición:Separar una cadena en cadenas de elementos

'aaabbccccabbb' 

en

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

¿Cuál es una manera elegante de hacer esto en Python? Si lo hace más fácil, se puede suponer que la cadena solo contendrá a's, b's yc's.

+0

posible duplicado de [¿Cómo dividir esta cadena con Python?] (Http://stackoverflow.com/questions/3940721/how -to-split-this-string-with-python) –

+1

¿Nadie sugirió expresiones regulares? Estoy impresionado y entristecido. –

+0

Sí, es un duplicado de la pregunta a la que Ethan se relacionó. Pero esa pregunta no tiene un título útil, IMO. – Colin

Respuesta

26

Ese es el caso uso de itertools.groupby :)

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

¡Sabía que habría una manera fácil de hacer esto! – Colin

3

Puede crear un iterador - sin tratar de ser inteligentes sólo para que sea breve e ilegible:

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'] 
>>> 

edición bien, entonces hay itertools.groupby, que probablemente hace algo como esto.

2

Aquí es la mejor manera que pude encontrar usando expresiones regulares:

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'] 
Cuestiones relacionadas