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

g.h*_*ins 4 python encoding python-2.7

与许多已经回答过的关于此主题的问题相比,我有一个更基本的“运行长度编码”问题。本质上,我正在尝试获取字符串

string = 'aabccccaaa'
Run Code Online (Sandbox Code Playgroud)

并返回

a2b1c4a3
Run Code Online (Sandbox Code Playgroud)

我以为,如果我能够设法将所有信息放入一个列表,如下所示,我将很容易能够返回a2b1c4a3

test = [['a','a'], ['b'], ['c','c','c','c'], ['a','a','a']]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我想出了以下代码,但是想知道是否有人可以帮助我弄清楚如何使其创建上面显示的输出。

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>
Run Code Online (Sandbox Code Playgroud)

如果有人对解决这样一个问题的更有效方法有任何其他意见,我非常高兴!

Mar*_*ers 5

您可以使用itertools.groupby():

from itertools import groupby

grouped = [list(g) for k, g in groupby(string)]
Run Code Online (Sandbox Code Playgroud)

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

您可以一步将其变成RLE:

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

每个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'
Run Code Online (Sandbox Code Playgroud)