Вы можете использовать groupby
из itertools
модуля:
s = "ABBBBCCCCCCCCAB"
from itertools import groupby
expected = ''.join([str(len(list(v)))+k for k,v in groupby(s)])
Выход :
'1A4B8C1A1B'
groupby(s)
возвращает объект itertools.groupby
. Понимание списка для этого объекта, например [(k,list(v)) for k,v in groupby(s)]
, возвращает нас упорядоченным образом:
[('A', ['A']), ('B', ['B', 'B', 'B', 'B']), ('C', ['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C']), ('A', ['A']), ('B', ['B'])]
Мы можем просто подсчитать количество подпунктов во втором элементе кортежа и добавить его формат строки перед первым элементом кортежа и объединить их все.
Обновление :
Вы пытаетесь изменить индекс итерации в цикле, выполнив char=char+1
, но он не меняет индекс итерации, т. Е. Цикл не проходит в течение следующих 2, 3 или 4 итераций. Добавьте эти две строки печати в свой код, и вы увидите, что переменная char
, которую вы пытаетесь увеличить во время цикла, - это не просто индекс итерации:
...
for char in range(0,len(message)-1,1):
print('\tchar at first line : ', char, 'char id now : ', id(char))
count=1
while(message[char]==message[char+1]):
count=count+1
char=char+1
print('char now : ', char, 'char id now : ', id(char))
...
Это должно вывести что-то вроде:
char at first line : 1 char id now : 11197408
char now : 2 char id now : 11197440
char now : 3 char id now : 11197472
char now : 4 char id now : 11197504
Видите, как id
каждого времени char
изменилось.