Как разделить эту строку с помощью Python? - PullRequest
8 голосов
/ 15 октября 2010

У меня есть строки, которые выглядят как этот пример: "AAABBBCDEEEEBBBAA"

В строке возможен любой символ.

Я хочу разбить его на список вроде: [ 'AAA', 'BBB', 'C', 'D', 'EEEE', 'BBB', 'AA']

поэтому каждый непрерывный отрезок тех же символов идет в отдельный элемент списка разделения.

Я знаю, что могу перебирать символы в строке, проверять каждую пару i и i-1, если они содержат один и тот же символ и т. Д., Но есть ли более простое решение?

Ответы [ 4 ]

15 голосов
/ 15 октября 2010

Мы могли бы использовать Regex:

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

В качестве альтернативы мы могли бы использовать itertools.groupby.

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

timeit показывает, что Regex работает быстрее (для этой конкретной строки) ( Python 2.6 , Python 3.1 ). Но Regex, в конце концов, специализируется на string, а groupby - универсальная функция, так что это не так уж неожиданно.

9 голосов
/ 15 октября 2010
>>> from itertools import groupby
>>> [''.join(g) for k, g in groupby('AAAABBBCCD')]
['AAAA', 'BBB', 'CC', 'D']

И при обычной манипуляции со строкой

>>> 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']
3 голосов
/ 15 октября 2010
import itertools
s = "AAABBBCDEEEEBBBAA"
["".join(chars) for _, chars in itertools.groupby(s)]
0 голосов
/ 01 декабря 2013

Просто еще один способ решения вашей проблемы:

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