【问题标题】:python encoder and decoderpython编码器和解码器
【发布时间】:2013-01-26 17:07:02
【问题描述】:

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

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

希望帮助您开始使用 python。

【问题讨论】:

  • 你有没有尝试过任何单行代码??
  • 所以试一试,也许用一个 for 循环。这样你更有可能得到有用的答案。
  • @JohnWard 你这是什么意思?启动记事本或其他 IDE - 这是一个好的开始。我们不会(或至少不应该)为您提供解决方案。尝试一些东西,然后用您将拥有的那段代码返回给我们。然后我们将对其进行分析并帮助您(或不帮助)。不要偷懒。您可能还会意识到您甚至不需要帮助。

标签: python encoding decode


【解决方案1】:

检查这些问题并不完全是你想要的,但它可以帮助你尝试这样做

Determining Letter Frequency Of Cipher Text

【讨论】:

    【解决方案2】:

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

    为了让您体验 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 加入一个可迭代对象以生成一个带有任何提供的分隔符的字符串,在这种情况下它是一个空字符串

    【讨论】:

    • len(list(v)) 在某些情况下可能会稍微快一些,但如果v 可能是无限的,sum 是合适的。
    【解决方案3】:

    cnode 的一种可能解决方案是简单地遍历字符串并计算字符出现次数,不是很花哨,但 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函数中构建字符串,然后返回。

    【讨论】:

    • -1:首先它假设输入不包含数字。其次:正则表达式?严重地?最后:为此类问题提供解决方案是一种反stackoverflow 行为。
    • 首先,输入几乎不能包含数字来获得那种输出,否则你需要在字母和字母计数之间使用某种分隔符。其次,是的,正则表达式,它们完成了工作——使用你的工具。最后:感谢您澄清这一点,我会努力在未来做得更好。
    • 是的,我猜你对数字的看法是正确的。至于正则表达式:我只是觉得在这种情况下它有点矫枉过正,特别是如果我们在输入中排除数字。
    • 有什么选择?逐个字符地遍历字符串,本质上是构建自己的小解析器?如果计数只能是一位数,我会同意您的看法,但显然它可以是任意长度,因此您必须以某种方式对其进行解析。
    • @pyrrrat:有一个单行的groupby 解决方案(两条行相反,虽然我想如果必须的话我可以把它打包成一个)。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2015-12-17
      • 1970-01-01
      相关资源
      最近更新 更多