2010-10-15 23 views
8

J'ai des chaînes qui ressemblent à cet exemple: « AAABBBCDEEEEBBBAA »Comment diviser cette chaîne avec python?

Tout caractère est possible dans la chaîne.

Je veux diviser à une liste comme: [ 'AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

si tous les l'étirement continu des mêmes caractères va séparer l'élément de la liste séparée.

Je sais que je peux itérer sur les caractères de la chaîne, vérifier chaque paire i et i-1 s'ils contiennent le même caractère, etc. mais existe-t-il une solution plus simple?

Répondre

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

Et par manipulation de chaîne normale

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

Nous pourrions utiliser Regex:

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

Sinon, nous pourrions utiliser itertools.groupby.

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

timeit montre Regex est plus rapide (pour cette chaîne particulière) (Python 2.6, Python 3.1). Mais Regex est après tout spécialisé pour la chaîne, et groupby est une fonction générique, donc ce n'est pas si inattendu.

+0

Wow, merci, solution regex est cool, GroupBy aussi, comment est il est possible que je passe autant de temps sur ce problème avant d'envoyer la question à stackoverflow et d'obtenir la réponse en 5 minutes ;-) – jan

+0

+1 pour utiliser regexp pour résoudre un problème pour lequel regexp est :) – Kimvais

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

Juste une autre façon de soloving votre problème:

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