为了账号安全,请及时绑定邮箱和手机立即绑定

符号的运行长度编码

符号的运行长度编码

慕的地8271018 2021-09-01 14:50:05
我正在尝试使用 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 = 0translate = ''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:  abbbbaaabbaaaa1b2b3b4b5a6a7a8b9b10a11a12a13输出实际上是应该的。a1b4a3b2a3有没有办法来解决这个问题?
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

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


import re

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

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


查看完整回答
反对 回复 2021-09-01
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

一种可能的方法是使用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对象又是一个生成器,它生成相应块中的所有字母。通过将其转换为 a list,我们可以检查其长度并将其附加到结果中。


查看完整回答
反对 回复 2021-09-01
  • 2 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信