Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 符号的游程编码_Python - Fatal编程技术网

Python 符号的游程编码

Python 符号的游程编码,python,Python,我正在尝试使用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('Ent

我正在尝试使用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)
当我运行我的程序时,这就是我得到的

输入您的单词:abbbaaabbaaa
a1b2b3b4b5a6a7a8b9b10a11a12a13
事实上,输出是指

a1b4a3b2a3

有办法解决这个问题吗?

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

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

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

您只需使用正则表达式即可解决此问题:

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

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

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

from itertools import groupby
''.join([f'{letter}{len(list(grouper))}' for letter, grouper in groupby(words)])
解释
itertools.groupby
将字符串拆分为具有相同字母的块,将每个块转换为一对
(字母,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>)
>>groupby('abbbaaabbaa')
>>>对于groupby中的块('abbbaaabbaa'):
打印(块)
(‘a’,)
(‘b’,)
(‘a’,)
(‘b’,)
(‘a’,)

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

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

from itertools import groupby
''.join([f'{letter}{len(list(grouper))}' for letter, grouper in groupby(words)])
解释
itertools.groupby
将字符串拆分为具有相同字母的块,将每个块转换为一对
(字母,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>)
>>groupby('abbbaaabbaa')
>>>对于groupby中的块('abbbaaabbaa'):
打印(块)
(‘a’,)
(‘b’,)
(‘a’,)
(‘b’,)
(‘a’,)
每个
itertools.\u grouper
对象也是一个生成器,它生成相应块中的所有字母。通过将其转换为
列表
,我们可以检查其长度并将其附加到结果中