В этих задачах всегда сохраняйте текущее состояние (текущий символ и текущий счет). Нет необходимости в индексах, более простая логика.
И, наконец, не забудьте «сбросить» данные текущего цикла, иначе вы пропустите последнюю итерацию.
Мое предложение:
s = "abbbbccdddaaabbbbeeff"
result = []
current = None
current_count = 0
for c in s:
if current == c:
current_count += 1
else:
if current_count > 1:
result.append(str(current_count))
current_count = 1
current = c
result.append(c)
# don't forget last iteration count
if current_count > 1:
result.append(str(current_count))
print("".join(result))
печать:
ab4c2d3a3b4e2f2
Хорошо, я знаю, "".join(result)
вызывает встроенную функцию, но это наиболее эффективный способ. Вы не хотите добавлять символ за символом для создания строки из списка.
Как только вы докажете, что осваиваете такие алгоритмы, используйте встроенные модули, такие как itertools.groupby
, для выполнения таких задач. Это быстрее и без ошибок (или даже лучше: этот другой ответ )