2010-10-15 22 views
8

Ho stringhe che assomigliano a questo esempio: "AAABBBCDEEEEBBBAA"Come dividere questa stringa con python?

Ogni personaggio è possibile nella stringa.

voglio dividerlo in una lista come: [ 'AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

così ogni l'allungamento continuo degli stessi caratteri va a separare l'elemento della lista divisa.

So che posso scorrere i caratteri nella stringa, controllare ogni coppia i e i-1 se contengono lo stesso carattere, ecc. Ma c'è una soluzione più semplice là fuori?

risposta

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

E dal normale manipolazione di stringhe

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

Potremmo usare Regex:

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

In alternativa, potremmo usare itertools.groupby.

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

timeit mostra Regex è più veloce (per questa particolare stringa) (Python 2.6, Python 3.1). Ma Regex è in special modo specializzato per la stringa, e groupby è una funzione generica, quindi non è così inaspettato.

+0

Wow, grazie, soluzione regex è freddo, GroupBy anche, come è è possibile che trascorro così tanto tempo su questo problema prima di inviare la domanda a StackOverflow e ottenere la risposta in 5 minuti ;-) – jan

+0

+1 per usare regexp per risolvere un problema che regexp è per :) – Kimvais

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

Solo un altro modo di soloving il problema:

#!/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 
Problemi correlati