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 语句。可能是一个菜鸟问题,但为此苦苦挣扎了一段时间。
添加回答
举报