3 回答
TA贡献1797条经验 获得超6个赞
最后一个 else 语句中有一个小错字。它说
else:
charStack.append(text[1])
这应该是
else:
charStack.append(text[i])
此外,您应该缩进函数中的所有内容,否则 python 不会知道它是函数的一部分。
def decompression(text):
intStack = []
charStack = []
temp = ""
result = ""
for i in range(len(text)):
if text[i].isdigit():
times = 0
while text[i].isdigit():
times = times * 10 + int(text[i])
i += 1
i -= 1
intStack.append(times)
elif text[i] == ']':
temp = ""
times = 0
if len(intStack) > 0:
times = intStack[-1]
intStack.pop()
while len(charStack) > 0 and charStack[-1] != '[':
temp += charStack[-1]
charStack.pop()
if len(charStack) > 0 and charStack[-1] == '[':
charStack.pop()
for j in range(times):
result += temp
for j in range(len(result)):
charStack.append(result[j])
result = ""
elif text[i] == '[':
if text[i-1].isdigit():
charStack.append(text[i])
else:
charStack.append(text[i])
intStack.append(1)
else:
charStack.append(text[i])
while len(charStack) != 0:
result += charStack[-1]
charStack.pop()
return result
TA贡献1856条经验 获得超17个赞
虽然这不是最佳做法,但它确实有效:
text = "3[b2[ca]]"
list = list(text)
try:
for i in range(len(list)*2):
if list[i] == '[':
list[i] = '*('
if list[i] == ']':
list[i] = ')'
if list[i].isalpha() and list[i+1].isdigit():
list.insert(i+1,"+")
if list[i].isalpha() and list[i+1].isalpha():
list.insert(i+1,"+")
if list[i].isalpha():
globals()[list[i]] = str(list[i])
except:
pass
print(list)
result = ''.join(list)
print(result)
print(eval(result))
基本上,它的作用是:
获取文本并将其转换为列表;
迭代列表长度的两倍(我们在循环本身期间对列表进行了一些追加,因此是双精度值);
整个迭代都在 a 内部,try: except: pass因此我们忽略了IndexError: list index out of range错误;
在迭代过程中,我们进行了一些查找和替换,慢慢地将字符串转换为数学表达式:[...]替换为*(...),它找到一个字母后跟一个数字,它添加+符号,并且它还找到彼此相邻的字母;
最后,使用globals()内置函数(https://docs.python.org/3/library/functions.html#globals)我们从列表中获取每个字母并将其声明为一个变量,该变量将自身的字符串表示形式作为一个值;
我们现在要做的就是加入列表的元素并在该结果字符串上使用eval() https://docs.python.org/3/library/functions.html#eval,我们得到结果:
>>> print(text)
3[b2[ca]]
>>> print(list)
['3', '*(', 'b', '+', '2', '*(', 'c', '+', 'a', ')', ')']
>>> result = ''.join(list)
>>> print(result)
3*(b+2*(c+a))
>>> print(eval(result))
bcacabcacabcaca
TA贡献1831条经验 获得超9个赞
除了上面提到的答案和评论之外,如果整数不是个位数,您查找 intStack 的逻辑将不起作用,我的意思是在您的示例输入 3[b2[ca]] 中 intStack 将是 [3,2] 很好但是如果输入是 33[b22[c6[a]]] 则 intStack 应该是 [33,22,6] 但在这种情况下你的逻辑会失败。
试试这个来寻找 intStack:
intStack = [];
index=[];
for i in range(len(text)):
if i not in index:
if text[i].isdigit():
times="";
while text[i].isdigit():
times+=text[i]
index.append(i);
i+=1
intStack.append(int(times))
添加回答
举报
