比较列表中的 int 值会抛出索引超出范围错误

问题描述

我正在努力理解这里的问题。我已经尝试了一切,但问题仍然存在。 基本上我有一个随机数列表,当我尝试比较循环内的值时,它会抛出“IndexError: list index out of range”

我什至尝试过 range(len(who) 和 len(who) 。同样的事情。当把 0 改为 int 变量的“currentskill”时,它可以工作。我不明白为什么比较两个值会抛出这个错误. 只是没有意义...

我不是比较值而是比较索引本身???

编辑:我什至尝试使用 print(i) / print(who[i] 来查看一切是否干净以及它在哪里停止,而且我绝对不会超出索引

who = [2,1]
currentskill = 1

for i in who:
        if who[i] == currentskill: # IndexError: list index out of range
            who.pop(i)

解决方法

问题是一旦你开始弹出元素列表大小就会变化

例如,获取大小为 6 的列表 但是您迭代所有索引直到 len(l)-1 = 6-1 = 5 并且在删除前一次迭代中的元素后索引 5 不存在于列表中。

这个问题的解决方案, l = [x for x in l if x] 这里 x 是您要在要迭代的列表元素上实现的条件。

,

如@Hemesh 所述

问题是一旦你开始弹出元素列表大小就会变化

问题解决了。我现在只是在循环外弹出元素,它可以工作:

def deleteskill(who,currentskill):
   temp = 0
   for i in range(len(who)):
       if who[i] == currentskill:
           temp = i
   who.pop(temp)
,

你的逻辑是错误的。要获取索引和值,请使用内置函数 enumerate:

idx_to_remove = []
for idx,i in enumerate(who)::
    if i == currentskill: 
        idx_to_remove.append[idx]

for idx in reversed(idx_to_remove):
        who.pop(idx)

根据@sabik 的建议进行编辑

,

您的代码中有两个问题:

  • 混淆值和索引,正如另一个答案所指出的;和

  • 在迭代时修改列表

解决方案取决于您是只想删除一项还是可能删除多项。

仅删除一项:

for idx,i in enumerate(who)::
    if i == currentskill: 
        who.pop(idx)
        break

用于删除多个项目:

to_remove = []
for idx,i in enumerate(who)::
    if i == currentskill: 
        to_remove.append[idx]
for idx in reversed(to_remove):
        who.pop(idx)

根据情况,创建新列表可能更容易:

who = [i for i in who if i != currentskill]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...