3 回答

TA貢獻1895條經驗 獲得超3個贊
這似乎過于復雜了。Python 擁有我們稱之為slicing的簡潔工具。它可以做的一件事是改變列表的一個小節,包括修改它的長度。所以我們可以寫:
def addValToPos(alist, position, value):
alist[position:position] = [value]
但是該操作已經可以作為list.insert.
其他小注意事項:[]創建一個新列表,list([])從而復制該空列表,然后將其丟棄。int(0)同樣是多余的,因為0已經是int; 這次沒有副本,因為int它是不可變的并且是部分實習的。
有一個完整的堆棧類也很奇怪,而沒有在那里定義它的任何行為。雖然 Pythonlist和deque類型涵蓋了堆棧功能,但實際堆棧將具有更簡單的一組操作;也許 push、pop 和 isempty。事實證明,您的其他片段依賴于這些,目前尚不清楚它們的作用;這意味著這會導致最小、完整、可驗證示例的完整部分失敗。
現在開始檢查代碼的意圖。
你的第if一個內部for意味著你應該從不同的范圍開始,因為有些position迭代什么都不做。好消息是,range完全有能力生產這種類型的范圍:range(position, len(self.stack))會做到的。
temporaryList += self.stack[i]可能不符合您的預期,因為它會從堆棧中取出一項并嘗試將其添加到temporaryList. 由于后者是一個列表,如果堆棧項不是列表,這將失敗,如果是,則合并它們。所以stack = [[1], [2]]會導致temporaryList = [1, 2]。也許您的意思是使用list.append而不是+=作為list.extend.
然后是第二遍調用pop從self. 這標志著一個隱含的依賴關系,即先前的訪問self.stack達到了相同的項目;它可能會self.push(v)充當self.stack.append(v),但我不知道。通常,在彈出時使用特定項目是個好主意;例如,如果我們正在專門使用堆棧進行練習,則將它們推入另一個堆棧。
看起來可以使用兩個切片操作替換整套預期操作:
temporaryList = self.stack[position:]
del self.stack[position:]
然后恢復循環通過提取項目和擴展再次執行展平操作。
我真的不知道你為什么認為你需要刪除temporaryList;它是一個局部變量,只存在于每個調用中。你也沒有向我們展示它是如何破壞的,所以我們缺乏關于你觀察和期望的信息。
我想我會停止猜測這一點。

TA貢獻1921條經驗 獲得超9個贊
我認為我temporaryList在第一次運行該函數后必須刪除的原因是因為當我運行我第二次發布的代碼時,我得到了這個輸出:
Enter max size: 6
Enter value: 1
Enter value: 2
Enter value: 3
Enter value: 4
Enter value: 5
Enter value: 6
# printing the numbers in self.stack
1
2
3
4
5
6
Increase the max size? (yes/no)yes
How much?2
# printing the numbers in self.stack
1
2
3
4
5
6
Size: 6
Maxsize: 8
Add value to pos? (yes/no)yes
Add position p: 2
Add value v: 9
# printing the numbers in self.stack
# this is the output i want
1
9
2
3
4
5
6
Size: 7
Maxsize: 8
Add value to pos? (yes/no)yes
Add position p: 1
Add value v: 8
# printing the numbers in self.stack
# here i don't know what happened
1
9
2
3
8
1
9
2
3
4
5
6
Size: 12
Maxsize: 8
Add value to pos? (yes/no)
相反,我只想增加一個添加的數字,就像我得到的第一個輸出一樣。提前致謝

TA貢獻1817條經驗 獲得超14個贊
我看到我沒有發布可運行的代碼。希望這有助于更多:
class Stack:
def __init__(self, maxSize):
self.stack = list([])
self.maxSize = maxSize
self.size = int(0)
def push(self, value):
self.stack.append(value)
self.size += 1
def print(self):
for i in range(len(self.stack)):
print(self.stack[i])
def addValToPos(self, position, value):
temporaryList = []
if self.maxSize <= self.size:
self.maxSize += 1
for i in range(len(self.stack)):
if i > position-1:
temporaryList += self.stack[i]
while self.size > position:
self.pop()
self.push(value)
for j in range(len(temporaryList)):
self.stack += temporaryList[j]
#temporaryList.pop()
while True:
if stabel.size < stabel.maxSize:
que = input("Add value to pos? (yes/no)")
if que.lower() == 'yes':
position = int(input("Add position p: "))
valToPos = int(input("Add value v: "))
stabel.addValToPos(position-1, valToPos)
stabel.size += 1
else:
break
elif stabel.size >= stabel.maxSize:
question0 = input("Increase the max size? (yes/no)")
if question0.lower() == 'yes':
addToMax0 = input("How much?")
stabel.increase(addToMax0)
else:
break
stabel.print()
stabel.showSize()
print("Maxsize: ", stabel.maxSize)
輸出
Enter max size: 4
Enter value: 1
Enter value: 2
Enter value: 3
Enter value: 4
1
2
3
4
Increase the max size? (yes/no)yes
How much?1
1
2
3
4
Size: 4
Maxsize: 5
Add value to pos? (yes/no)yes
Add position p: 2
Add value v: 9
1
9
2
3
4
Size: 5
Maxsize: 5
Add value to pos? (yes/no)
在這里我也很掙扎,因為 Size 和 Maxsize 是相同的(5),但它在 while True 循環的第一個 if 語句處停止,即使self.size和self.maxSize是相同的。我的意圖是self.maxSize在這一點上增加 elif 語句??赡苁且粋€菜鳥問題,但為此苦苦掙扎了一段時間。
添加回答
舉報