python编码器和解码器

时间:2013-01-26 17:07:02

标签: python encoding decode

我想使用文本编码构建编码器和解码器。

字符串“AAABBBBCDDDDDDDDDEDEDDDD”作为输入,返回字符串“A3B4C1D10E2D4”,其中每个字母符号后跟字符串中的频率。解码器反转过程。

想帮助开始使用python。

4 个答案:

答案 0 :(得分:1)

检查这些问题并不完全符合您的要求,但它可以帮助您尝试这样做

Determining Letter Frequency Of Cipher Text

答案 1 :(得分:1)

解决方案可以通过不同的方式进行处理,并且作为基于循环的解决方案非常简单,并且留给您作为练习

为了让您体验Python电池的强大功能,我建议使用groupby解决方案

>>> ''.join("{}{}".format(k, sum(1 for e in v))
        for k,v in groupby("AAABBBBCDDDDDDDDDDEEDDDD"))
'A3B4C1D10E2D4'

此解决方案的突出特点

  1. itertools.groupby将类似的连续数据分组为关键的值对,其中键是重复元素,值是重复组
  2. 由于该组是生成器,len可能无法在此处运行,但计算任何非序列可迭代长度的可能方法是使用sum
  3. str.join加入一个iterable来生成一个包含任何提供的分隔符的字符串,在本例中是一个空字符串

答案 2 :(得分:0)

我首先看一下python string文档,专门查找或统计并从那里开始工作。虽然我不确定如果字符串中的实际内容以这种方式重要,你可以真正解码你编码的任何内容。

答案 3 :(得分:0)

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函数中构建字符串,然后返回。