2012-02-29 33 views
8

voglio dividere una stringa simile a ripetere:stringa di Spalato in stringhe di elementi

'aaabbccccabbb' 

in

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

Che cosa è un modo elegante per fare questo in Python? Se rende più semplice, si può presumere che la stringa conterrà solo a's, b's e c's.

+0

possibile duplicato di [Come dividere questa stringa con Python?] (Http://stackoverflow.com/questions/3940721/how -to-split-this-string-with-python) –

+1

Nessuno ha suggerito le espressioni regolari? Sono entrambi impressionato e rattristato. –

+0

Sì, è un duplicato della domanda a cui Ethan si è collegato. Ma quella domanda non ha un titolo utile, IMO. – Colin

risposta

26

Questo è il caso impiego per itertools.groupby :)

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

Sapevo che ci sarebbe stato un modo semplice per farlo! – Colin

3

È possibile creare un iteratore - senza cercare di essere intelligente solo per mantenere breve e illeggibile:

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

modifica ok, quindi c'è itertools.groupby, che probabilmente fa qualcosa del genere.

2

Qui è il modo migliore che ho trovato usando espressioni regolari:

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