4
N=8
f,g=4,7
indexList = range(N)
print indexList
print f, g
indexList.pop(f)
indexList.pop(g)

在此代码中,我收到一条错误消息,指出gin的弹出索引indexList超出范围。这是输出:

[0, 1, 2, 3, 4, 5, 6, 7]
4 7
Traceback (most recent call last):
indexList.pop(g)
IndexError: pop index out of range

我不明白,g值为 7,列表包含 7 个值,为什么无法返回列表中的 7?

4

3 回答 3

7

要获得弹出列表的最终值,您可以这样做:

>>> l=range(8)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7]
>>> l.pop(4)                    # item at index 4
4
>>> l
[0, 1, 2, 3, 5, 6, 7]
>>> l.pop(-1)                   # item at end - equivalent to pop()
7
>>> l
[0, 1, 2, 3, 5, 6]
>>> l.pop(-2)                   # one left of the end 
5
>>> l
[0, 1, 2, 3, 6]
>>> l.pop()                     # always the end item
6
>>> l
[0, 1, 2, 3]

请记住,pop会删除该项目,并且列表会在 pop 后更改长度。使用负数从可能改变大小的列表末尾开始索引,或者只使用没有参数的 pop() 结束项目。

由于弹出可能会产生这些错误,因此您经常会在异常块中看到它们:

>>> l=[]
>>> try:
...    i=l.pop(5)
... except IndexError:
...    print "sorry -- can't pop that"
... 
sorry -- can't pop that
于 2012-08-29T16:18:21.810 回答
6

弹出 4 后,列表只有 7 个值。如果你print indexList在你的之后pop(f),它会看起来像:

[0, 1, 2, 3, 5, 6, 7]
于 2012-08-29T16:12:22.173 回答
4

与所有其他答案一样,该pop()函数的重要部分是它从数组中删除值,从而更改索引。弹出索引 4 后,您的列表中剩下 7 个项目。重要的是要知道 Python 索引从 0 开始,因此您的 7 项列表仅包含索引 0 到 6。这就是弹出索引 7 超出范围的原因,它不再存在。

通常在实现堆栈队列时使用“弹出”函数,其中目标是从等待处理的值列表中获取值。为避免意外处理两次相同的数据,请确保在检索的同时将其删除。

有时堆栈和队列可以通过一个peek只返回值而不删除它的操作来实现,但是由于 Python 仅使用常规数组实现堆栈和队列,而没有任何特殊的包装器,因此您的 peek 函数将是标准array[index]调用。

----EDIT----
在我看来,可能不是删除索引7 处的项目,而是希望删除7。如果是这种情况,您应该调用indexList.remove(7). 这将删除7列表中的第一个实例,无论它的索引是什么(如果没有 value 则抛出错误7)。不过,我很确定你明白这pop()需要一个索引。

以防万一,请查看Python 数据结构 API,以获取有关哪些函数可用、它们做什么以及它们采用哪些参数的更多信息。

于 2012-08-29T16:24:23.810 回答