如何解决比较列表中的 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 举报,一经查实,本站将立刻删除。