使用列表推导在Python中的运行长度编码

2024-10-01 07:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个更基本的游程编码问题,与许多关于这个主题的问题已经得到了回答。基本上,我是想抓住绳子

string = 'aabccccaaa'

让它回来

^{pr2}$

我想,如果我能像下面所示的那样将所有的信息放入一个列表中,我就可以很容易地返回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>

如果有人对如何更有效地解决这样一个问题有任何其他意见,我会全神贯注地听!在


Tags: 代码test信息编码主题列表stringcurrent
2条回答

您可以使用^{}

from itertools import groupby

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

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

您可以一步到位地将其转化为RLE:

^{pr2}$

每个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'

考虑使用^{}工具。在

演示

import more_itertools as mit


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

编码

^{pr2}$

"".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是可通过^{}安装的第三方库。

相关问题 更多 >