我想获得一个程序或函数,将文本文件中的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"
)
如果有人可以简化这个
答案 0 :(得分:0)
我真的看不到您的代码应该如何将字符串分成2 + 1个字符的组,但是无论如何,即使使用命令dict
或OrderedDict
也不起作用,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