问题描述
对于学校作业,我必须使用Python编写编码器和解码器,该编码器和解码器采用一串编码字符,例如:“ 2k3b”,并将其解码为“ kkbbb”。我已经编写了编码器并使用pytest对其进行了测试,但是似乎无法将头放在编写解码器上。编码器和解码器的代码分别发布在下面。
def encode(mess):
""" Run length encoding - convert string from 'wwwwwwbbbb' til '6w4b'"""
res = []
old_val = mess[0]
count = 0
for char in mess:
if char == old_val:
count += 1
else:
res.append('%d%c' % (count,old_val))
old_val = char
count = 1
res.append('%d%c' % (count,char))
return ''.join(res)
我知道最后一个res.append('%d%c' % (count,char))
是不好的编码,但是我只能使它起作用,而且我对Python的经验还不够。
def decode(mess):
"""Run length decoding - convert string from '2k3b' to 'kkbbb'"""
res = []
num = 0
letter = ''
for char in mess:
mess.split()
if char.isdigit():
num = int(char)
else:
num = 0
res.append(num * '%c' % letter)
return ''.join(res)
解码器还没有完成,只是我停了下来,因为我无法“看到”我应该做的事情。我通常为所有配置编写伪代码,而为编码器和解码器都编写了伪代码,但是由于某种原因,解码器无法通过我。 我相信,我只是失去了我的思想的痕迹,但我真的可以用在这一个了一些指导。我不愿意问我的老师,因为他只会向我展示他的代码,而我不会从中学到任何东西。
解决方法
您当前的方法将仅限于单个数字字符串,并且在查找字符串中的10个或更多字符串时会比较费力,而不是最好使用正则表达式来查找数字字符串,然后是字符,然后将这些结合在一起
import re
letter_groups = re.findall("(\d+)(\D+)",mess)
return "".join(f"{c * int(num)}" for num,c in letter_groups)
,
您快到了。以下是您的方法,但有一些小的更改。
def decode(mess):
"""Run length decoding - convert string from '2k3b' to 'kkbbb'"""
res = []
num = ''
for char in mess:
#If char an integer just add it to current num
# required for cases where integer will be greater than 9.
if char.isdigit():
num += char
else:
# "a"* int("3") = "aaa" we can use this property to expand
# after expanding just set the num to 0
res.append(char*int(num))
num = ''
return ''.join(res)
测试:
>>>print(decode(encode('kkkkkkkkkkkkkkkkkwwkkeeerrr'))=="kkkkkkkkkkkkkkkkkwwkkeeerrr"))
True