如何计算python中字符串中重复的字符

gan*_*dra 1 python string list

编写一个 python 函数,它对给定的字符串执行运行长度编码并返回运行长度编码的字符串。

我尝试使用循环但无法获得预期的输出。

def encode(message):    
    #Remove pass and write your logic here
    count=0
    encoded_message=[]
    for char in range(0,len(message)-1,1):
        count=1
        while(message[char]==message[char+1]):

             count=count+1;
             char=char+1
        encoded_message.append(str(count)+message[char])

    return encoded_message

encoded_message=encode("ABBBBCCCCCCCCAB")
print(' '.join(encoded_message))
Run Code Online (Sandbox Code Playgroud)

预期输出为1A4B8C1A1B。我得到的是1A 4B 3B 2B 1B 8C 7C 6C 5C 4C 3C 2C 1C 1A

Ark*_*tev 5

您可以使用groupbyfromitertools模块:

s = "ABBBBCCCCCCCCAB"
from itertools import groupby
expected = ''.join([str(len(list(v)))+k for k,v in groupby(s)])
Run Code Online (Sandbox Code Playgroud)

输出

'1A4B8C1A1B'
Run Code Online (Sandbox Code Playgroud)

groupby(s)返回一个itertools.groupby对象。对这个对象的列表理解像[(k,list(v)) for k,v in groupby(s)]这样以有序的方式返回给我们:

[('A', ['A']), ('B', ['B', 'B', 'B', 'B']), ('C', ['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C']), ('A', ['A']), ('B', ['B'])]
Run Code Online (Sandbox Code Playgroud)

我们可以只计算元组第二项中子项的数量,并将其字符串格式添加到元组的第一项之前并加入所有子项。

更新:您正在尝试通过执行更改循环中的迭代索引,char=char+1但它不会更改迭代索引,即循环不会在接下来的 2 或 3 或 4 次迭代中通过。在您的代码中添加这两个打印行,您会看到char您在循环时尝试增加的变量不仅仅是迭代索引:

...
for char in range(0,len(message)-1,1):
        print('\tchar at first line : ', char, 'char id now : ', id(char))
        count=1
        while(message[char]==message[char+1]):
            count=count+1
            char=char+1
            print('char now : ', char, 'char id now : ', id(char))
            ...
Run Code Online (Sandbox Code Playgroud)

它应该输出如下内容:

    char at first line :  1 char id now :  11197408
char now :  2 char id now :  11197440
char now :  3 char id now :  11197472
char now :  4 char id now :  11197504
Run Code Online (Sandbox Code Playgroud)

看,id每次的是如何char改变的。