首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python编码器和解码器

python编码器和解码器
EN

Stack Overflow用户
提问于 2013-01-27 01:07:02
回答 4查看 2.1K关注 0票数 1

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

一个字符串"AAABBBBCDDDDDDDDDDEEDDDD“作为输入,返回一个字符串"A3B4C1D10E2D4",每个字母符号后面跟着它在字符串中的频率。解码器反转这一过程。

希望在python中获得入门帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-27 01:22:03

cnoder的一种可能的解决方案是简单地迭代字符串并计算字符出现的次数,不是很花哨,但却是O(n)。

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
import re

def decode(s):
    for c, n in re.findall(r'(\w)(\d+)', s):
        yield c * int(n)

给定您的测试输入

代码语言:javascript
复制
s = 'AAABBBBCDDDDDDDDDDEEDDDD'

encoded = ''.join(encode(s))
print encoded

decoded = ''.join(decode(encoded))
print decoded

结果:

代码语言:javascript
复制
A3B4C1D10E2D4
AAABBBBCDDDDDDDDDDEEDDDD

还有一点需要注意的是,这里并没有使用yield的真正原因,当然也可以先在en-/decode函数中构建字符串,然后再返回。

票数 0
EN

Stack Overflow用户

发布于 2013-01-27 01:18:55

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

Determining Letter Frequency Of Cipher Text

票数 1
EN

Stack Overflow用户

发布于 2013-01-27 01:46:50

该解决方案可以通过不同的方式来实现,并且作为基于循环的解决方案非常简单,留给您作为练习

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

代码语言:javascript
复制
>>> ''.join("{}{}".format(k, sum(1 for e in v))
        for k,v in groupby("AAABBBBCDDDDDDDDDDEEDDDD"))
'A3B4C1D10E2D4'

此解决方案的显著功能

  1. itertools.groupby将相似的连续数据分组为关键字,值对,其中关键字是重复元素,值是重复字符串的组,因为组是生成器,因此len在这里可能不起作用,但计算任何非序列可迭代的长度的一种可能方法是使用sum
  2. str.join连接可迭代,以生成具有任何提供的分隔符的字符串,在这种情况下,它是一个空字符串
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14539319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档