【问题标题】:Python: how to replace a substring with a number of its occurences?Python:如何用它的出现次数替换子字符串?
【发布时间】:2025-11-21 23:45:02
【问题描述】:

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

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 用户和一个新的 * 成员,所以如果问题被错误地提出,请原谅。

【问题讨论】:

  • 向我们展示您所知道的方式,以便我们了解您认为“笨重和原始”的东西。
  • 我建议你搜索运行长度编码。
  • 将代码放入问题中。很难在评论中阅读冗长的代码。
  • @khelwood 这很有帮助,谢谢!
  • @JohnGordon 代码现在在问题中,但我必须警告你——它真的很笨重!我想应该改用字典或列表。

标签: python string replace count run-length-encoding


【解决方案1】:

利用标准库:

from itertools import groupby

st = "abbbccccaaaAAbccc"

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

输出:

a1b3c4a3A2b1c3
>>> 

【讨论】:

    【解决方案2】:

    只需循环并计数。有更优雅的 sn-ps 但这将完成工作并且很清楚:

    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:])
    

    【讨论】:

      最近更新 更多