Это называется "кодированием по длине прогона".В библиотеке Python more-itertools есть функция, которая выполняет эту кодировку:
>>> from more_itertools import run_length
...
... string1 = "aaaabbcaaddd"
... list(run_length.encode(string1))
[('a', 4), ('b', 2), ('c', 1), ('a', 2), ('d', 3)]
Мы можем получить желаемый результат, сгладив его и выполнив строку.
>>> list(flatten(run_length.encode(string1)))
['a', 4, 'b', 2, 'c', 1, 'a', 2, 'd', 3]
>>> list(map(str, flatten(run_length.encode(string1))))
['a', '4', 'b', '2', 'c', '1', 'a', '2', 'd', '3']
>>> ''.join(map(str, flatten(run_length.encode(string1))))
'a4b2c1a2d3'