2010-10-15 21 views
8

ich Strings haben, die wie in diesem Beispiel aussehen: „AAABBBCDEEEEBBBAA“Wie teilt man diese Zeichenfolge mit Python?

Jedes Zeichen ist möglich, in der Zeichenkette.

möchte ich es auf eine Liste spalten wie: [ 'AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

so jede Die fortlaufende Dehnung der gleichen Zeichen wird in das separate Element der Aufteilungsliste übernommen.

Ich weiß, dass ich über Zeichen in der Zeichenfolge iterieren kann, überprüfen Sie jedes i und i-1 Paar, wenn sie das gleiche Zeichen usw. enthalten, aber gibt es eine einfachere Lösung da draußen?

Antwort

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

Und durch normale String-Manipulation

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

Wir konnten Regex verwenden:

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

Alternativ könnten wir itertools.groupby verwenden.

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

timeit zeigt Regex schneller ist (für diese bestimmte Zeichenfolge) (Python 2.6, Python 3.1). Aber Regex ist nach allem auf String spezialisiert, und groupby ist eine generische Funktion, so dass dies nicht so unerwartet ist.

+0

Wow, danke, regex Lösung ist cool, GROUPBY, wie ist Es ist möglich, dass ich so viel Zeit mit diesem Problem verbringe, bevor ich die Frage an stackoverflow sende und die Antwort in 5 Minuten bekomme ;-) – jan

+0

+1 für die Verwendung von regexp, um ein Problem zu lösen, für das regexp zuständig ist :) – Kimvais

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

Nur ein weiterer Weg, um Ihr Problem des soloving:

#!/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 
Verwandte Themen