我有带有相同字符块的字符串,例如'1254,,,,,,,,,,,,,,,,,982'。我的目标是用类似 '1254(,16)982' 的方式替换它,以便可以重建原始字符串。如果有人能指出我正确的方向,将不胜感激
问问题
228 次
3 回答
7
您正在寻找运行长度编码:这是一个松散地基于此的 Python实现。
import itertools
def runlength_enc(s):
'''Return a run-length encoded version of the string'''
enc = ((x, sum(1 for _ in gp)) for x, gp in itertools.groupby(s))
removed_1s = [((c, n) if n > 1 else c) for c, n in enc]
joined = [["".join(g)] if n == 1 else list(g)
for n, g in itertools.groupby(removed_1s, key=len)]
return list(itertools.chain(*joined))
def runlength_decode(enc):
return "".join((c[0] * c[1] if len(c) == 2 else c) for c in enc)
对于您的示例:
print runlength_enc("1254,,,,,,,,,,,,,,,,982")
# ['1254', (',', 16), '982']
print runlength_decode(runlength_enc("1254,,,,,,,,,,,,,,,,982"))
# 1254,,,,,,,,,,,,,,,,982
(请注意,只有在您的字符串中有很长的运行时,这才会有效)。
于 2012-10-29T13:30:52.013 回答
3
如果您不关心确切的压缩形式,您可能需要查看zlib.compress
and zlib.decompress
。zlib
是一个标准的 Python 库,可以压缩单个字符串,并且可能会比自我实现的压缩算法获得更好的压缩。
于 2012-10-29T13:51:41.343 回答
1
使用正则表达式:
s = '1254,,,,,,,,,,,,,,,,982'
import re
c = re.sub(r'(.)\1+', lambda m: '(%s%d)' % (m.group(1), len(m.group(0))), s)
print c # 1254(,16)982
使用迭代工具
import itertools
c = ''
for chr, g in itertools.groupby(s):
k = len(list(g))
c += chr if k == 1 else '(%s%d)' % (chr, k)
print c # 1254(,16)982
于 2012-10-29T15:53:54.703 回答