【问题标题】:Pop index out of range [duplicate]弹出索引超出范围[重复]
【发布时间】:2012-08-24 07:29:18
【问题描述】:
N=8
f,g=4,7
indexList = range(N)
print indexList
print f, g
indexList.pop(f)
indexList.pop(g)

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

[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?

【问题讨论】:

    标签: python list indexing range


    【解决方案1】:

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

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

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

    ----编辑----
    我突然想到,您可能希望删除 index 7 处的项目,而不是删除 index 7 处的项目。如果是这种情况,您应该调用indexList.remove(7)。这将删除列表中7 的第一个实例,无论它的索引是什么(如果没有值7,则会引发错误)。不过,我很确定你明白 pop() 需要一个索引。

    以防万一,请查看the Python datastructures API,了解有关哪些函数可用、它们做什么以及它们采用哪些参数的更多信息。

    【讨论】:

    • 提问者知道indexList有7个项目(“列表包含7个值”)
    • @DavidRobinson 我确实用我的“索引 0 到 6”评论解决了这一点,但你有一点,我没有足够强调这一点。我已经相应地编辑了我的回复。
    【解决方案2】:

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

    >>> 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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 7 个值,而不是 6 个(数一下)。
      • 在此编辑之后,这并没有回答问题(提问者知道该列表包含 7 个值,并明确表示)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多