我正在研究一种简单的压缩算法,用于压缩二进制文件。我正在扫描文件,并用字符和该字符在其后出现的次数填充列表。但是,由于所有方括号和逗号,该列表的格式设置使压缩结果更大,因此我需要删除这些内容。我尝试了几种删除它们的方法,但是没有任何效果。 这是编码算法:
def encode(inputString):
characterCount = 1
previousCharacter = ''
List = []
for character in inputString:
if character != previousCharacter:
if previousCharacter:
listEntry = (previousCharacter, characterCount)
List.append(listEntry)
#print lst
characterCount = 1
previousCharacter = character
else:
characterCount += 1
else:
try:
listEntry = (character, characterCount)
List.append(listEntry)
return (List, 0)
except Exception as e:
print("Exception encountered {e}".format(e=e))
return (e, 1)`
这是我打印列表的位置。散列的注释是我已经尝试过的没有运气的方法。
value = encode(binaryfile)
if value[1] == 0:
print(value[0])
#flattened = [val for sublist in value for val in sublist]
#print(flattened)
#values = value[0]
#print(*value[0], sep='')
#print (''.join(map(str, value)))
#print(int("".join(str(x) for x in value[0])))
这是输出。
[('1', 2), ('0', 1), ('1', 1), ('0', 4), ('1', 2), ('0', 2), ('1', 4), ('0', 3), ('1', 1), ('0', 3), ('1', 4), ('0', 5), ('1', 1), ('0', 1), ('1', 1), ('0', 4), ('1', 2), ('0', 1), ('1', 2), ('0', 3), ('1', 1), ('0', 3), ('1', 2), ('0', 1), ('1', 1), ('0', 1), ('1', 3), ('0', 4), ('1', 1), ('0', 130), ('1', 5), ('0', 15), ('1', 2), ('0', 8), ('1', 7), ('0', 1), ('1', 8), ('0', 4), ('1', 1), ('0', 2), ('1', 1), ('0', 13), ('1', 2), ('0', 96), ('1', 1), ('0', 26), ('1', 3), ('0', 70), ('1', 1), ('0', 22), ('1', 3), ('0', 1), ('1', 1), ('0', 32), ('1', 1), ('0', 24), ('1', 7), ('0', 1), ('1', 24), ('0', 34), ('1', 2), ('0', 1), ('1', 3), ('0', 24), ('1', 3459), ('0', 1), ('1', 2), ('0', 2), ('1', 1), ('0', 1), ('1', 1), ('0', 2), ('1', 1), ('0', 1), ('1', 3), ('0', 5), ('1', 1), ('0', 10), ('1', 1), ('0', 2), ('1', 3), ('0', 1), ('1', 2), ('0', 9), ('1', 1), ('0', 2), ('1', 1), ('0', 5), ('1', 1), ('0', 18), ('1', 4), ('0', 7), ('1', 1), ('0', 2), ('1', 1), ('0', 1), ('1', 1),
非常感谢您的帮助
答案 0 :(得分:1)
所以您要获取1201110412
,依此类推?在元组列表中,您可以使用itertools.chain
:
from itertools import chain
value = [('1', 2), ('0', 1), ('1', 1), ('0', 4), ('1', 2), ('0', 2), ('1', 4), ('0', 3), ('1', 1), ('0', 3), ('1', 4), ('0', 5), ('1', 1), ('0', 1), ('1', 1), ('0', 4), ('1', 2), ('0', 1), ('1', 2), ('0', 3), ('1', 1), ('0', 3), ('1', 2), ('0', 1), ('1', 1), ('0', 1), ('1', 3), ('0', 4), ('1', 1), ('0', 130), ('1', 5), ('0', 15), ('1', 2), ('0', 8), ('1', 7), ('0', 1), ('1', 8), ('0', 4), ('1', 1), ('0', 2), ('1', 1), ('0', 13), ('1', 2), ('0', 96), ('1', 1), ('0', 26), ('1', 3), ('0', 70), ('1', 1), ('0', 22), ('1', 3), ('0', 1), ('1', 1), ('0', 32), ('1', 1), ('0', 24), ('1', 7), ('0', 1), ('1', 24), ('0', 34), ('1', 2), ('0', 1), ('1', 3), ('0', 24), ('1', 3459), ('0', 1), ('1', 2), ('0', 2), ('1', 1), ('0', 1), ('1', 1), ('0', 2), ('1', 1), ('0', 1), ('1', 3), ('0', 5), ('1', 1), ('0', 10), ('1', 1), ('0', 2), ('1', 3), ('0', 1), ('1', 2), ('0', 9), ('1', 1), ('0', 2), ('1', 1), ('0', 5), ('1', 1), ('0', 18), ('1', 4), ('0', 7), ('1', 1), ('0', 2), ('1', 1), ('0', 1), ('1', 1)]
print(''.join(map(str, chain.from_iterable(value))))
# 12011104120214031103140511011104120112031103120111011304110130150151208170118041102110131209611026130701102213011103211024170112403412011302413459011202110111021101130511010110213011209110211051101814071102110111
或者,如果您从1101000011
之类的字符串开始,则可以使用itertools.groupby
from itertools import groupby
inputString = '11010000110011110001000111100000101000011011000100011010111000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111110000000000000001100000000111111101111111100001001000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000111000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000111010000000000000000000000000000000010000000000000000000000001111111011111111111111111111111100000000000000000000000000000000001101110000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110110010100101110000010000000000100111011000000000100100000100000000000000000011110000000100101'
print(''.join([k + str(sum(1 for _ in g)) for k, g in groupby(inputString)]))
# 12011104120214031103140511011104120112031103120111011304110130150151208170118041102110131209611026130701102213011103211024170112403412011302413459011202110111021101130511010110213011209110211051101814071102110111
答案 1 :(得分:0)
听起来像您只想要一个字符串而不是一个列表的声音。只需使用字符串而不是附加到列表即可。
代替
List = []
for character in inputString:
if character != previousCharacter:
if previousCharacter:
listEntry = (previousCharacter, characterCount)
List.append(listEntry)
使用此
string = ''
for character in inputString:
if character != previousCharacter:
if previousCharacter:
string += previousCharacter + str(characterCount)
或者,您可以获取列表并在末尾将其转换为字符串,但是最好以字符串开头而不是首先创建列表。
''.join(x[0] + str(x[1]) for x in List)