RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 595126
Accepted
Emil Aliyev
Emil Aliyev
Asked:2020-11-24 04:51:17 +0000 UTC2020-11-24 04:51:17 +0000 UTC 2020-11-24 04:51:17 +0000 UTC

基本 RLE 编码 python

  • 772

https://stepik.org/lesson/Base-RLE-encode-21299/step/2?adaptive=true&unit=5100

该算法的输入是包含拉丁字母字符的字符串。该字符串被分成几组连续的相同字符(“系列”)。每个系列都以重复符号和重复次数为特征。写入代码的正是这些信息:首先写入一系列重复字符的长度,然后写入字符本身。对于长度为一个符号的系列,将省略重复次数。

例如,考虑这条线

aaabccccCCaB

把它分解成系列

aaa b cccc CC a B

之后,我们对系列进行编码并得到最终的字符串,我们将考虑算法的结果。

3ab4c2CaB

输入格式:一行包含拉丁字母的任意字符。

输出格式:包含编码序列的字符串。

示例输入 1:aaabccccCCaB 示例输出 1:3ab4c2CaB

这是一个这样的任务。现在代码处于糟糕的状态,因为我无法理解错误是什么。我已经以最平庸的方式明确指出了输入行的长度并删除了单位。

vvod = 'aaabccccCCaB' #input()
if len(vvod) > 1:
    count = 1
    prev = ''
    lst = []
    for i in vvod:
        if i != prev:
            if prev:
                entry = ''
                entry = str(count) + prev
                lst.append(entry)
            count = 1
            prev = i
        else:
                count += 1
    else:
        entry = str(count) + i
        lst.append(entry)
    edinici = ''.join(lst)
    x = ''
    for i in edinici:
        if i != '1':
            x = x + i
    print(x)
else:
    print(vvod)

我恳请你帮忙解决这个问题,也许我会寻找另一本问题书。

没有通过现场测试。没有明确的解释,产生错误的答案。解释器正确显示所有内容 - 我从任务中输入了示例输入并自己编写了任意行。

Failed test #6. Wrong answer
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    jfs
    2020-11-24T07:24:55Z2020-11-24T07:24:55Z

    itertools.groupby()对于这样的任务,使用将相邻相同元素分组的函数会很方便:

    import itertools
    
    def compress(text):
        for char, same in itertools.groupby(text):
            count = sum(1 for _ in same) # number of repetitions
            yield char if count == 1 else str(count)+char
    

    例子:

    >>> ''.join(compress("aaabccccCCaB"))
    '3ab4c2CaB'
    

    要查找代码中的错误,请编写显式测试并简化它:

    #!/usr/bin/env python3
    import unittest
    
    def rle_encode(text):
        result = []
        text += '\0' # dummy
        last = text[0]
        count = 1
        for char in text[1:]:
            if char != last:
                result.append(last if count == 1 else str(count)+last)
                last = char
                count = 0
            count += 1
        return ''.join(result)
    
    class RLETests(unittest.TestCase):
        def test_edges(self):
            self.assertEqual(rle_encode(''), '') # empty
            self.assertEqual(rle_encode('a'), 'a') # one
            self.assertEqual(rle_encode('aa'), '2a') # two
            self.assertEqual(rle_encode('aab'), '2ab') # two + one
            self.assertEqual(rle_encode('abb'), 'a2b') # one + two
            self.assertEqual(rle_encode('aabb'), '2a2b') # two + two
    
        def test_nonletter(self):
            self.assertEqual(rle_encode('ab b'), 'ab b')
            self.assertEqual(rle_encode('abb\0\0'), 'a2b')
    
        def test_input(self):
            self.assertEqual(rle_encode('aaabccccCCaB'), '3ab4c2CaB')
    

    您可以遍历所有可能的字符串,直到一定长度且不超过指定的字母:

        def test_exhaustive(self):
            for r in range(6):
                for text in map(''.join, itertools.product('abcAB', repeat=r)):
                    with self.subTest(text=text):
                        self.assertEqual(rle_groupby(text), rle_encode(text))
    
    
    if __name__ == '__main__':
        unittest.main()
    

    在哪里:

    def rle_groupby(text):
        return ''.join([char if count == 1 else str(count)+char
                        for char, same in itertools.groupby(text)
                        for count in [sum(1 for _ in same)]])
    
    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5