Python:如何用它出现的次数替换一个子串?

Python: how to replace a substring with a number of its occurences?

假设我有一个以下列方式呈现的字符串:

st = 'abbbccccaaaAAbccc' 

任务是对其进行编码,以便单个字符后跟它们的多次出现:

st = 'a1b3c4a3A2b1c3'

我知道一种可能的解决方案,但它过于庞大和原始。

s = str(input())
l = len(s)-1
c = 1
t = ''
if len(s)==1:
    t = t +s+str(c)
else:
    for i in range(0,l):
        if s[i]==s[i+1]:
            c +=1
        elif s[i]!=s[i+1]:
            t = t + s[i]+str(c)
            c = 1
        for j in range(l,l+1):
            if s[-1]==s[-2]:
            t = t +s[j]+str(c)
        elif s[-1]!=s[-2]:
            t = t +s[j]+str(c)
            c = 1
print(t)

有什么方法可以快速优雅地解决这个问题吗?

P.S:我是一个没有经验的Python用户,也是Whosebug的新成员,所以如果问题问错了,请原谅。

只需遍历并计数。还有更多优雅的片段,但这将完成工作并且很清楚:

count = 1
char = st[0]
new_st = []
for c in st[1:]:
    if c == char:
        count += 1
    else:
      new_st.append(char + str(count))
      char = c
      count = 1
new_st.append(char + str(count))
s2= "".join(new_st)

print(s2)  # 'a1b3c4a3A2b1c3'

如果你想要一个奇特的递归解决方案:

def compose(s):
    if not s:
        return ""

    count = 1
    for char in s[1:]:
        if s[0] != char:
            break
        count += 1
    return s[0] + str(count) + compose(s[count:])

利用标准库:

from itertools import groupby

st = "abbbccccaaaAAbccc"

print("".join("{}{}".format(key, len(list(group))) for key, group in groupby(st)))

输出:

a1b3c4a3A2b1c3
>>>