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
您可以使用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改变的。