【问题标题】:Why do I get 'pop index out of range' error in python 3?为什么在 python 3 中出现“pop index out of range”错误?
【发布时间】:2020-11-25 09:12:59
【问题描述】:

L.pop(i) 函数有问题。这是我的代码:

L = []  

for i in range(3):
    value = int(input('Enter value ' + str( i+1)+ ': '))  

    L.append(value)

print(L)

limit = int(input('Enter a limit: '))
for i in L:
    if i > limit:
        print('Index of first element over',limit,':',i)
        L.pop(i)  
        break
    
print(L)     

直到那部分:L.pop(i)。 它给了

IndexError: pop index out of range

那么L.pop(i)有什么问题呢?

【问题讨论】:

  • 尝试在L.pop(i) 行之前打印ilen(L) - 这应该澄清它;)
  • 我认为你混淆了pop(删除索引)和remove(删除元素)
  • @tobias_k 你不会也遇到与remove 相同的问题吗?
  • @Gsk 取决于你的意思是什么问题。这里实际上没有“循环删除”问题,因为 OP 在删除元素后会中断。但是,尚不清楚 OP 实际想要实现什么,例如删除大于limit 的第一个元素,或全部删除,以及是否应将limit 与元素本身或其索引进行比较。
  • @tobias_k 是的,我的错。在阅读之前进行假设(.pop()pop index out of range 是经典!)

标签: python python-3.x list indexing spyder


【解决方案1】:

我认为您混淆了pop(删除索引处的元素)和remove(删除元素本身)。使用 for i in L: 迭代元素,然后在 printL.pop(i) 中将它们视为索引。

假设你想打印大于limit的第一个元素index,然后删除那个元素,你可以试试这个:

for i in range(len(L)):
    if L[i] > limit:
        print('Index of first element over',limit,':',i)
        L.pop(i)  
        break

或者这个:

for i, e in enumerate(L)::
    if e > limit:
        print('Index of first element over',limit,':',i)
        L.pop(i)  # or L.remove(e), but pop might be a bit faster
        break

注意:从列表中删除元素,无论是通过remove 还是pop,同时迭代同一个列表通常会有点问题。在这种情况下,这是可以的,因为您在删除元素后立即从循环中break,但请记住这一点,以防您想将其扩展到例如删除所有大于limit的元素。

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 2013-04-27
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多