То, что вы пытаетесь достичь, называется run-length-encoding :
Вы можете решить эту проблему, просто перебирая текст и считая символы, сохраняя их в кортежах и создавая выходные данныеиз этих кортежей:
text = "AAARRRGGHH"
def runLengthEncode(t):
cnt = 0 # how often did we see this character?
cha = t[0] # which character
rv = [] # resulting list that stores our (character, count) tuples
for c in t: # process each character of the given text
if c == cha: # if it is equal to what we look for
cnt +=1 # increment counter
else:
rv.append( (cha,cnt) )
cnt = 1 # append so far counted ones as tuple (character,count)
cha = c # and remember the new char with a count of 1
rv.append( (cha,cnt) ) # add the last character and its count
# produce the output from our remembered tuples
return ' '.join( "{} {}".format(charac, nr) for charac,nr in rv)
print( runLengthEncode(text) )
Вывод:
A 3 R 3 G 2 H 2
Гораздо более питонический (itertools) ответ можно найти как ответ от Martijn Pieters длявопрос Длина кодирования в Python с пониманием списка :
(несколько отредактировано)
from itertools import groupby
string = "AAARRRGGHH"
print(' '.join(['{} {}'.format(k, sum(1 for _ in g)) for k, g in groupby(string)]))
Вывод:
A 3 R 3 G 2 H 2