如何在不创建子列表的情况下进行 运行-length 编码?

How to do run-length encoding without creating sublists?

感谢您的帮助,我想知道如何制作一个对列表进行 运行 长度编码但不创建子列表的函数。原因是每个列表代表二维列表的一行。这样,当我去解码所有内容时,我将能够逐行进行解码,并保留原始列表的行。 如果可能,修改我附上的代码,因为它通过写入重复值的数字而不是写入仅出现一次的值的数字来进行 运行 长度编码。

from itertools import groupby
def modified_encode(alist):
        def ctr_ele(el):
            if len(el)>1:
                return [len(el), el[0]]
            else:
                return el[0]
        return [ctr_ele(list(group)) for key, group in groupby(alist)]

我会解释的。以下是使用此处发布的函数的示例:


wall = 'wall'
concrete = 'concrete'
>>> map=[wall, wall, concrete, concrete]
>>> modified_encode(map)
[[2, 'wall'], [2, 'concrete']]

我想要的结果是:

[2, 'wall', 2, 'concrete']

你总是可以 return list - 即使是单个项目 [ el[0] ] - 然后你可以使用你可以添加列表的事实:

[2,'wall'] + [2,'concrete'] + ['single'] 给出 [2,'wall',2,'concrete','single']

您甚至可以为此使用 sum(..., [])

from itertools import groupby

def modified_encode(alist):
    def ctr_ele(el):
        if len(el)>1:
            return [len(el), el[0]]
        else:
            return [ el[0] ]   # <--- return list with single element
    
    result = (ctr_ele(list(group)) for key, group in groupby(alist))
    flatten = sum(result , [])  # <--- add all lists to `[]`

    return flatten

data = ['wall', 'wall', 'concrete', 'concrete', 'single']

modified_encode(data)

结果:

[2, 'wall', 2, 'concrete', 'single']

编辑:

或者您可以用不同的方式编写它 - 不使用 ctr_ele - 并使用 append()

from itertools import groupby

def modified_encode(alist):
    result = []
    
    for key, group in groupby(alist):
        el = list(group)
        if len(el) > 1:
            result.append(len(el))
        result.append(el[0])
        
    return result

data = ['wall', 'wall', 'concrete', 'concrete', 'single']

modified_encode(data)