繁体   English   中英

使用列表理解在 Python 中进行运行长度编码

[英]Run Length Encoding in Python with List Comprehension

与已经回答的有关该主题的许多问题相比,我有一个更基本的运行长度编码问题。 本质上,我正在尝试使用字符串

string = 'aabccccaaa'

并让它返回

a2b1c4a3

我想,如果我能设法将所有信息放入如下所示的列表中,我将很容易返回 a2b1c4a3

test = [['a','a'], ['b'], ['c','c','c','c'], ['a','a','a']]

到目前为止,我想出了以下代码,但想知道是否有人能够帮助我弄清楚如何让它创建我上面说明的输出。

def string_compression():
    for i in xrange(len(string)):
        prev_item, current_item = string[i-1], string[i]
        print prev_item, current_item
        if prev_item == current_item:
            <HELP>

如果有人对解决此类问题的更有效方法有任何其他评论,我会全力以赴!

你可以使用itertools.groupby()

from itertools import groupby

grouped = [list(g) for k, g in groupby(string)]

这将生成您的每个字母组作为列表列表。

您可以一步将其转换为RLE:

rle = ''.join(['{}{}'.format(k, sum(1 for _ in g)) for k, g in groupby(string)])

每个k是被分组的字母,每个g是一个迭代器,产生相同字母的N倍; sum(1 for _ in g)表达式以尽可能最有效的方式计算。

演示:

>>> from itertools import groupby
>>> string = 'aabccccaaa'
>>> [list(g) for k, g in groupby(string)]
[['a', 'a'], ['b'], ['c', 'c', 'c', 'c'], ['a', 'a', 'a']]
>>> ''.join(['{}{}'.format(k, sum(1 for _ in g)) for k, g in groupby(string)])
'a2b1c4a3'

考虑使用more_itertools.run_length工具。

演示

import more_itertools as mit


iterable = "aabccccaaa"
list(mit.run_length.encode(iterable))
# [('a', 2), ('b', 1), ('c', 4), ('a', 3)]

"".join(f"{x[0]}{x[1]}" for x in mit.run_length.encode(iterable))  # python 3.6
# 'a2b1c4a3'

"".join(x[0] + str(x[1]) for x in mit.run_length.encode(iterable))
# 'a2b1c4a3'

替代itertools /功能样式:

"".join(map(str, it.chain.from_iterable(x for x in mit.run_length.encode(iterable))))
# 'a2b1c4a3'

注意: more_itertools是可通过pip install more_itertools安装的第三方库。

我是 Python 初学者,这就是我为 RLE 编写的内容。

s = 'aabccccaaa'
grouped_d = [(k, len(list(g))) for k, g in groupby(s)]

result = ''
for key, count in grouped_d:
    result += key + str(count)

print(f'result = {result}')

暂无
暂无

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

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