当前位置: 首页 > 编程笔记 >

Python中remove漏删和索引越界问题的解决

仲君昊
2023-03-14
本文向大家介绍Python中remove漏删和索引越界问题的解决,包括了Python中remove漏删和索引越界问题的解决的使用技巧和注意事项,需要的朋友参考一下

list.remove方法在删除元素的时候往往会出现漏删或者索引越界的情况示例如下:

漏删:

lst=[9,25,12,36]
for i in lst:
	if i>10:
		lst.remove(i)
print(lst)
>>>[9, 12]

那么为什么12被漏删了呢?其实原理很简单,如图:


列表从下标为0开始遍历,遍历到25时,将25删除,返回一个新的列表:


注意,原来的25对应的下标是1,所以系统会从下标为2的地方开始遍历,但是在新列表中,下标为2的地方变成了36,所以12就被跳过了。

解决方法:

只需要判断如果列表中删除元素,就要重新从0开始遍历列表。

lst=[9,25,12,36]
while True:
	for i in lst:
		if i>10:
			lst.remove(i)
			#如果删除了元素,退出此次遍历,开始遍历新列表
			break
	else:
		break
print(lst)
>>>[9]

索引越界:

当我们用下标遍历列表时,会出现索引越界的情况,如图:

lst=[9,25,12,36]
for i in range(len(lst)):
	# print(i)
	if lst[i]>10:
		lst.remove(lst[i])
print(lst)

IndexError: list index out of range

原理都是一样的,这里 i 的取值为 0 1 2 3 ,当删除一个元素之后,新列表的长度减少,索引变为 0 1 2 ,但是 i 还是根据原来列表的索引取值,所以当 i 取到 3 的时候,新列表没有该元素,索引越界。

解决方法一:

lst=[25,9,12,36]
j=0
for i in range(len(lst)):
	if lst[j]>10:
		# 下面以j取0为例:
		# j =0 时对应元素25被删除,
		# continue的做法的意思是判断新列表的j元素即0元素是否符合条件
		lst.remove(lst[j])
		continue
	# 如果新列表的j = 0 处不符合条件,j+1,然后再判断下一个元素。
	j+=1
print(lst)

解决方法二(推荐):

如果让索引倒序遍历列表就不会出现越界的问题了。
这样就算新列表的长度减小了,那么i 的取值是倒着取的,列表缺少一个元素对 i 的取值无影响。
例如 i 为3 的元素被删除了,新列表最高索引为2 而此时 i的下一个取值正好是 2 ,没有影响。

lst=[9,25,12,36]
for i in range(len(lst)-1,-1,-1):
	# i : 3 2 1 0
	if lst[i]>10:
		lst.remove(lst[i])
print(lst)

到此这篇关于Python中remove漏删和索引越界问题的解决的文章就介绍到这了,更多相关Python remove漏删和索引越界内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 在我的游戏代码中,我尝试添加一张手牌。一旦我做完了,我的数组就超出了范围。一切看起来都不错,但也许我缺少了一些东西。 仅供参考,一个和两个是Player实例。来自Main类的相关代码(对格式感到抱歉。我很想将其传输到Stack Overflow): 卡类: 玩家等级: 问题答案: 问题出在你的循环上 没有其他任何值可设置,因此此循环不断循环,直到所有玩家拥有超过52张牌为止。一旦某人拥

  • 本文向大家介绍C++中new的越界访问问题,包括了C++中new的越界访问问题的使用技巧和注意事项,需要的朋友参考一下 今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误。 如果犯了和我一样的错,也能知道自己错在哪里! <(^-^)> 函数如下:(斐波那契数列的实现) 上面的程序有BUG,如果传给函数的参数是0,程序就会因为触发一个断点而崩溃。 单步调试,根据内存窗口

  • 这段代码是关于一个水罐车游荡在一个环境中寻找有任务的水站。 试图通过访问点的数组列表进行递增,但每次运行代码时,我都得到一个“indexoutofboundsexception”,但其索引不同,而且大小总是与索引相同,所以我非常困惑。中断程序的索引/大小看起来是随机变化的。 示例错误:线程“main”java.lang.IndexOutOfBoundsException:Index:5,SIZE:

  • 我正在为一个老式电话计划编写Java代码,所以我有: 频段类: 速率类: 我想在Rate类中编写一个方法,如果给定一周中的某一天,它将返回一个由该周中某一天的带组成的带数组。 我写的是: 但是我一直得到一个索引越界异常(索引2越界,长度为2)。 我怎么能解决这个?

  • 这是我的代码: 该程序的目的是要求用户输入一个字符串,然后统计字符串中每个字符的使用次数。 当我去编译程序时,它工作正常。当我运行程序时,我可以在弹出框中输入字符串,但是在我提交字符串并按确定后,我得到一个错误,说 我不完全确定问题是什么或如何解决。

  • 这似乎微不足道,但也许我对向量的理解并不是它应该是的。我在这段代码上得到[java.lang.ArrayIndexOutOfBoundsException:Array index out of range:1]。错误发生在第3行。既然look是基于向量的大小,那么数组怎么会越界呢? 方法“getChangeSets()”返回一个列表。该列表最初是作为向量创建的。