我有一个txt文件,其编写如下:
6
abcd<<<<<<
n<J<g<1<A<
ABCD<<<1>>>2<<3>->>>>>>
我想用python使用&#39; stack&#39;来解码这个文件。 。 在此文件中,&#39;&lt;&#39;意味着光标移动这个←方式 &#39;&gt;&#39;表示光标移动→这种方式 和&#39; - &#39;表示在光标的位置后删除左侧单词。
所以最后,我想要的是
abcd
A1gJn
A1BC32
我试图通过某种功能来解决这个问题 但我不知道我的功能有什么问题。 下面写的就是我所做的。
def decodeString_stack(string):
"""Recover a string from a keylog string
input: string(string), output:(decoded string)
deCoded[ ] : list of decoded string(cursor left)
temp[ ] : list of decoded string(cursor right)
"""
deCoded=[]; temp=[]
for ch in string:
if ch=='<':
x=deCoded.pop()
temp.append(x)
elif ch=='>':
x=temp.pop()
deCoded.append(x)
elif ch=='-':
del deCoded[len(deCoded)-1]
return ''.join(deCoded)
它总是停止因为列表是空的
import time
fr=open("input.txt",'r')
fw=open("output_txt",'w')
print('start decoding')
startTime=time.time()
for aLine in fr:
deCoded=decodeString_stack(aLine)
print(deCoded)
exeTime=time.time()-startTime
print("decode complete(laspe time= %.2f sec)" %exeTime)
fr.close(); fw.close()
我怎么能做对吗?
答案 0 :(得分:0)
请注意,您正在定义一个空列表'deCoded',然后立即尝试从其中“pop()”。要使pop工作,必须在列表中添加一些内容。我怀疑这是作业,所以我不会深入研究解决方案 - 只需注意pop是从堆栈中取出的东西,但如果不存在则你不能取消东西:)
deCoded=[]; temp=[]
for ch in string:
if ch=='<':
x=deCoded.pop()
temp.append(x)
不要放弃太多,希望这会让你开始。此外,如果你还没有使用它,我强烈推荐Pycharm。您可以免费获得它 - 它将允许您逐步调试代码。这将是一个救生员。
def decode_line(line : str):
temp = []
decoded = []
for char in line:
if char == "<":
if temp:
c = temp.pop()
decoded.append(c)
elif char == ">":
pass
elif char == "-":
pass
else:
temp.append(char)
reversed = decoded[::-1]
return reversed
with open('source.txt') as source:
for line in source:
out = decode_line(line)
print(out)