2015-08-22 4 views
-2

Я пытаюсь уменьшить строку с помощью дубликатов, но я не хочу создавать набор. НапримерУдалить дубликаты, но сохранить последовательность

mystring = 'TTTTTPPPTPTTTTPPPPPPPPP' 

Последовательность букв «TPTPTP», так что мне нужна результирующая строка

newstring = 'TPTPTP' 

я уверен, что есть простой один лайнер, но его уклонение от меня

+1

Как вы не однолинейный? –

ответ

1

почтовый индекс каждого символа с одного до и принять тех, которые отличаются:

>>> a 
'TTTTTPPPTPTTTTPPPPPPPPP' 
>>> ''.join(i for i, j in zip(a, '\0' + a) if i != j) 
'TPTPTP' 
5

Вы ищете itertools.groupby.

>>> mystring = 'TTTTTPPPTPTTTTPPPPPPPPP' 
>>> groups = [x for x, y in itertools.groupby(mystring)] 
>>> groups 
['T', 'P', 'T', 'P', 'T', 'P'] 
>>> ''.join(groups) 
TPTPTP 

Official documentation

+1

Можете ли вы добавить намного больше деталей, чтобы это был не ответ на ссылку, даже без ссылки? – TigerhawkT3

+1

@ TigerhawkT3 Сделано. –

+0

Хороший ответ. Это один из вариантов использования canonical для * itertools.groupby * и напоминает инструмент командной строки '' uniq''. –

1

Вы также можете использовать регулярные выражения, если вы чувствуете, как он.

>>> import re 
>>> mystring = 'TTTTTPPPTPTTTTPPPPPPPPP' 
>>> ''.join(re.findall(r'(.)\1*', mystring)) 
'TPTPTP' 

Это поиск любого символа, за которым следует один и тот же найденный символ ноль или более раз.

+0

Я думаю, что кто-то действительно ненавидит регулярные выражения ... – TigerhawkT3

+0

Все примеры приветствуются! –