我想建立一个编码器和解码器使用文本编码。
一个字符串"AAABBBBCDDDDDDDDDDEEDDDD“作为输入,返回一个字符串"A3B4C1D10E2D4",每个字母符号后面跟着它在字符串中的频率。解码器反转这一过程。
希望在python中获得入门帮助。
发布于 2013-01-27 01:22:03
cnoder的一种可能的解决方案是简单地迭代字符串并计算字符出现的次数,不是很花哨,但却是O(n)。
def encode(s):
last = s[0]
count = 0
for c in s:
if last != c:
yield '%s%i' % (last, count)
last = c
count = 0
count += 1
yield '%s%i' % (last, count)对于解码器,您可以使用正则表达式,它可以很好地为您拆分字符串,而不需要编写自己的解析器。
import re
def decode(s):
for c, n in re.findall(r'(\w)(\d+)', s):
yield c * int(n)给定您的测试输入
s = 'AAABBBBCDDDDDDDDDDEEDDDD'
encoded = ''.join(encode(s))
print encoded
decoded = ''.join(decode(encoded))
print decoded结果:
A3B4C1D10E2D4
AAABBBBCDDDDDDDDDDEEDDDD还有一点需要注意的是,这里并没有使用yield的真正原因,当然也可以先在en-/decode函数中构建字符串,然后再返回。
发布于 2013-01-27 01:18:55
检查这个问题并不完全是你想要的,但它可以帮助你做到这一点
发布于 2013-01-27 01:46:50
该解决方案可以通过不同的方式来实现,并且作为基于循环的解决方案非常简单,留给您作为练习
为了让您体验一下Python电池的强大功能,我提出了一个使用groupby的解决方案
>>> ''.join("{}{}".format(k, sum(1 for e in v))
for k,v in groupby("AAABBBBCDDDDDDDDDDEEDDDD"))
'A3B4C1D10E2D4'此解决方案的显著功能
https://stackoverflow.com/questions/14539319
复制相似问题