微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决比较列表中的 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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?