簡體   English   中英

我這里的代碼有問題嗎? 我對結果有問題

[英]Is there any problem with my code here? I am having trouble with the result

這是我的代碼:我想將字符串從“3[b2[ca]]”解碼為“bcacabcacabcaca”。 但我的結果是“[[[”。 有人可以幫我嗎?

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[1])
    while len(charStack) != 0:
        result += charStack[-1]
        charStack.pop()
    return result

print(decompression("3[b2[ca]]"))

我一直都有錯誤的答案,我已經檢查了幾次並使用其他在線編輯器進行了測試,但是這段代碼有什么問題? 我還是想不通。

最后一個 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

除了上面提到的答案和評論之外,如果整數不是個位數,那么您查找 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))

雖然這不是最佳實踐,但它有效:

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))

基本上,它的作用是:

  • 獲取文本並將其轉換為列表;
  • 迭代列表長度的兩倍(我們在循環本身期間向列表添加了一些內容,因此是雙精度值);
  • 整個迭代都在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM