2011-08-31 4 views
3

J'essaie de scinder une chaîne en une liste, séparée par un changement de caractère, en python. Je trouve cela très difficile, mais je suis sûr que je suis en train de le penser et que je manque une solution probablement simple. Exemple:Comment trouver et diviser une chaîne par des caractères répétés?

'abgg22ffeeekkkk1zzabbb'

deviendrait:

[ 'a', 'b', 'gg', '22', 'ff', 'eee', 'kkkk', '1', 'zz', 'a', 'bbb']

Répondre

5
import itertools 
[''.join(value) for key, value in itertools.groupby(my_str)] 
+0

Merci, qui a fonctionné parfaitement. Comme je suis encore très jeune en python, je n'aurais jamais imaginé cette méthode. J'écrivais une fonction très longue pour faire ce que vous faisiez en une ligne. Y a-t-il une chance que vous puissiez expliquer comment cela fonctionne exactement ou me diriger dans la bonne direction? Je regarde le doc itertools, mais c'est un peu plus que je suis capable de saisir ATM. – Zak

+0

Ouais, les trucs dans itertools sont géniaux et souvent flexibles. :-) Voir l'implémentation équivalente dans les docs [itertools.groupby] (http://docs.python.org/library/itertools.html#itertools.groupby) et je parie que ce que vous écrivez était similaire en longueur. La différence est que itertools le fait vraiment de manière itérative et n'a donc pas besoin de charger toute la séquence en mémoire ou de la conserver pour cela. Vous pourriez vouloir [lire] (http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/) sur les itérateurs et pourquoi ils sont bons. –

+0

Merci beaucoup, ces liens semblent être extrêmement utiles. – Zak

2
>>> import re 
>>> my_str = 'abgg22ffeekkkk1zzabbb' 
>>> [m.group() for m in re.finditer(r'(.)\1*', my_str)] 
['a', 'b', 'gg', '22', 'ff', 'ee', 'kkkk', '1', 'zz', 'a', 'bbb'] 
Questions connexes