繁体   English   中英

符号的游程长度编码

[英]Run Length encoding of symbols

我正在尝试使用python编写游程编码代码。如果消息包含长符号序列。 我打算将其编码为符号列表以及符号出现的次数。这是我的代码

alphabets = ['a','b','c','d','e','f','g','h','i','j','k',
             'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
char_count = 0
translate = ''

words = input('Enter your word:  ')

for char in words:
    if char in alphabets:
        char_count += 1
        translate += char + str(char_count)

print(translate)

当我运行程序时,这就是我得到的。

Enter your word:  abbbbaaabbaaa
a1b2b3b4b5a6a7a8b9b10a11a12a13

输出实际上是预期的。

a1b4a3b2a3

有没有办法解决这个问题?

您可以简单地使用正则表达式来解决问题:

import re
translate = re.sub(r"((.)\2*)", lambda x: x.group(2) + str(len(x.group(1))), words)

此正则表达式在words字符串中找到所有相似的连续符号组,并用其长度编码替换它们。

一种可能的方法是使用itertools.groupby

from itertools import groupby
''.join([f'{letter}{len(list(grouper))}' for letter, grouper in groupby(words)])

说明

itertools.groupby将字符串拆分为相同字母的块,将每个块转换为对(letter, grouper)然后返回生成这些对的对象:

>>> groupby('abbbbaaabbaaa')
<itertools.groupby at 0x6fffeafa098>

>>> for chunk in groupby('abbbbaaabbaaa'):
        print(chunk)
('a', <itertools._grouper object at 0x6fffeaf2cf8>)
('b', <itertools._grouper object at 0x6fffeae9908>)
('a', <itertools._grouper object at 0x6fffeae9898>)
('b', <itertools._grouper object at 0x6fffeaf2320>)
('a', <itertools._grouper object at 0x6fffeae9898>)

每个itertools._grouper对象还是一个生成器,它生成相应块中的所有字母。 通过将其转换为list ,我们可以检查其长度并将其附加到结果中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM