流行指数超出范围

时间:2012-08-29 16:09:59

标签: python list indexing range pop

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

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

[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返回给我?

3 个答案:

答案 0 :(得分: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会产生这些错误,因此您经常会在exception block

中看到它们
>>> l=[]
>>> try:
...    i=l.pop(5)
... except IndexError:
...    print "sorry -- can't pop that"
... 
sorry -- can't pop that

答案 1 :(得分:6)

弹出4后,列表中只有7个值。如果您在print indexList之后pop(f),则会显示如下:

[0, 1, 2, 3, 5, 6, 7]

答案 2 :(得分:3)

除了所有其他答案之外,关于pop()函数的重要部分是它从数组中删除了值,从而更改了索引。弹出索引4后,您的列表将剩下7个项目。重要的是要知道Python索引从0开始,所以你的7项列表只包含索引0到6.这就是为什么弹出索引7超出界限,它不再存在。

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

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

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

以防万一,请查看the Python datastructures API,了解更多有关可用功能,功能以及参数的信息。