如何以2的运行长度将ASCII art压缩为RLE(或以相同方式将RLE解压缩为ascii)?

时间:2019-05-14 09:19:25

标签: python

我想获得一个程序或函数,将文本文件中的ASCII艺术作品压缩为运行长度为2的RLE,因此它计算字符数并按如下方式显示:04662312x52c02z01 03a(只是一个例如),因此它需要2个数字和一个字符。

from collections import OrderedDict 
def runLengthEncoding(input): 
    dict=OrderedDict.fromkeys(input, 0) 
    for ch in input: 
        dict[ch] += 1
    for key,value in dict.iteritems(): 
         output = output + key + str(value) 
    return output

我已经尝试过此代码,但不适用于数字字符(它将53405211c读为"53405211", "c"而不是"53", "4" "05", "2" "11", "c"

如果有人可以简化这个

1 个答案:

答案 0 :(得分:0)

我真的看不到您的代码应该如何将字符串分成2 + 1个字符的组,但是无论如何,即使使用命令dictOrderedDict也不起作用,dict最多只能保存一个键,即它不能表示像01a01b01a这样的编码字符串。相反,您应该创建一个元组列表,并且可以仅使用字符串切片和带有range的{​​{1}}:

step=3

从您的问题中并不能真正弄清楚该函数是应该对字符串进行编码还是解码,但是从您的最后一句话来看,我认为您想对它们进行解码。使用def runLengthEncoding(s): return [(int(s[i:i+2]), s[i+2]) for i in range(0, len(s), 3)] >>> runLengthEncoding("04662312x52c02z01 03a") [(4, '6'), (62, '3'), (12, 'x'), (52, 'c'), (2, 'z'), (1, ' '), (3, 'a')] 和一些itertools.groupby可以轻松完成另一个方向:

str.join