我为以下样本字符串编写了以下代码,以实现Lempel-Ziv压缩算法:
AAAABBCDEABCDABCAAABCDEEEEEECBBBBBBDDAAE
代码:
keys=[]
text = open('test').read() # contain of the string: AAAABBCDEABCDABCAAABCDEEEEEECBBBBBBDDAAE
index=0
t=time.time()
def sub_strin_check(text,index_num):
n = 1
while True:
substring = text[index_num:index_num+n]
if substring not in keys :
print(substring)
keys.append(substring)
# print(keys[-1])
return (index_num+n)
else:
n = n+1
continue
while True:
try:
if text[index] not in keys:
# print (index)
keys.append(text[index])
print(keys.append(text[index]),text[index])
except:
break
else:
try:
index = sub_strin_check(text,index)
print(index)
print(index)
index = index + 1
except:
break
res = str(keys)
print(res)
with open("result","w") as f:
f.write(res)
但结果是:
['A', 'A', 'AA', 'AB', 'C', 'C', 'CD', 'ABC', 'ABCA', 'ABCD', 'E', 'E', 'EE', 'EEC', 'B', 'B', 'BB', 'BBD', 'AAE']
我的想法是在字符串(文本)中使用索引号,并检查切割出的子字符串是否存在于键字典中,如果不存在,则添加它。如果存在,则继续检查子字符串并添加下一个字符。请帮忙看看我的错误在哪里?
PS:我知道互联网上有一些Lempel-Ziv Python代码,但我必须使用这个代码。
PPS:Lempel Ziv算法的工作方式如下。 首先检查给定字符串中的第一个字符是否存在于键(字典)中,如果不存在,则检查字符串中的下一个字符,并检查此新子字符串是否存在于键中。如果不存在,则添加子字符串;如果存在,则添加下一个字符并继续此过程...例如,对于我的字符串,输出应该是:
[A,AA,AB,B,C,D,ABC,AAA,BC,DE,E,EE,EEE,CB,BB,BBB,DD,AAE]
。
sub_strin_check(text, index)
的返回值。(你想让“else: sub_strin_check()”成为“if text[index] not in keys:”或第一个“try”语句的一部分吗?) - greybeard