N=8
f,g=4,7
indexList = range(N)
print indexList
print f, g
indexList.pop(f)
indexList.pop(g)
在此代码中,我收到一条错误消息,指出g
中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返回给我?
答案 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超出界限,它不再存在。
通常在实现stack或queue时使用“弹出”功能,其目标是从等待处理的值列表中获取值。为避免意外处理相同的数据两次,请务必在检索的同时将其删除。
有时堆栈和队列可以使用peek
操作来实现,该操作只返回值而不删除它,但由于Python只使用常规数组而不使用任何特殊包装器来实现堆栈和队列,因此您的peek函数将成为标准array[index]
致电。
<强> ---- ---- EDIT 强>
在我看来,可能是这样的情况,而不是删除索引 7中的项目,您希望删除值 7.如果是这种情况,您应该调用indexList.remove(7)
。这将删除列表中7
的第一个实例,无论其索引是什么(如果没有值7
则抛出错误)。我很确定你明白pop()
需要一个索引。
以防万一,请查看the Python datastructures API,了解更多有关可用功能,功能以及参数的信息。