如何编写解码器,然后可以使用pytest对其进行测试?

问题描述

对于学校作业,我必须使用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