如何编写解码器,然后可以用 pytest 对其进行测试?
How to write a decoder, which can then be tested with 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
对于一项学校作业,我必须在 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