gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:54:04 24 4
gpt4 key购买 nike

我想要一个程序或函数将文本文件中的 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")

如果有人可以简化这个

最佳答案

我真的不明白你的代码应该如何将字符串拆分为 2+1 个字符的组,但无论如何,使用 dictOrderedDict 不会工作,因为即使有序, dict 最多可以保存一次任何键,即它不能表示像 01a01b01a 这样的编码字符串。相反,您应该创建一个元组列表,并且可以仅使用字符串切片和带有 step=3range 来实现:

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 轻松完成:

# RLE -> Text
s = "04662312x52c02z01 03a"
pairs = [(int(s[i:i+2]), s[i+2]) for i in range(0, len(s), 3)]
# [(4, '6'), (62, '3'), (12, 'x'), (52, 'c'), (2, 'z'), (1, ' '), (3, 'a')]
text = ''.join(n * c for n, c in pairs)
# '666633333333333333333333333333333333333333333333333333333333333333xxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccczz aaa'

# Text -> RLE
from itertools import groupby
pairs = [(len(list(g)), k) for k, g in groupby(text)]
# [(4, '6'), (62, '3'), (12, 'x'), (52, 'c'), (2, 'z'), (1, ' '), (3, 'a')]
s = ''.join("%02d%s" % (n, c) for n, c in pairs)
# '04662312x52c02z01 03a'

关于python - 如何将 ASCII art 压缩为游程长度为 2 的 RLE(或以相同方式将 RLE 解压缩为 ascii)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56126903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com