python编码器和装饰

2024-09-29 21:42:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

希望帮助您开始使用python。在


Tags: 字符串文本编码过程字母符号编码器解码器
3条回答

检查这些问题,不要完全是你想要的,但它可以帮助你做到这一点

Determining Letter Frequency Of Cipher Text

这个解决方案可以用不同的方式来实现,而且作为一个基于循环的解决方案,它非常简单,留给您作为练习

为了让您体验一下Python电池的强大功能,我提出了一个使用groupby的解决方案

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

此解决方案的显著特点

  1. itertools.groupby将类似的连续数据分组为键-值对,其中key是重复元素,value是重复组
  2. 由于组是生成器,len在这里可能不起作用,但是计算任何非序列iterable的长度的一种可能的方法是使用sum
  3. str.join连接iterable以生成带有任何分隔符的字符串,在本例中它是一个空字符串

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)

对于解码器,您可以使用正则表达式来很好地拆分字符串,而不需要编写自己的解析器。在

^{pr2}$

根据你的测试输入

^{3}$

结果

A3B4C1D10E2D4
AAABBBBCDDDDDDDDDDEEDDDD

还有一点,这里没有真正的理由使用yield,当然也可以先在en-/decode函数中构建字符串,然后返回。在

相关问题 更多 >

    热门问题