1

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

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

想要帮助开始使用python。

4

4 回答 4

1

检查这个问题不是你想要的,但它可以帮助你尝试做到这一点

确定密文的字母频率

于 2013-01-26T17:18:55.333 回答
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连接一个可迭代对象以生成一个带有任何提供的分隔符的字符串,在这种情况下它是一个空字符串
于 2013-01-26T17:46:49.737 回答
0

我将从查看 python字符串文档开始,特别是从那里查找或计数和工作。尽管我不确定如果字符串中的实际内容以这种方式很重要,您是否真的可以解码您编码的任何内容。

于 2013-01-26T17:14:04.197 回答
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 函数中构建字符串,然后返回。

于 2013-01-26T17:22:02.587 回答