Python—remove在循环中会有删除不干净的情况:
在Python中remove用于删除一次指定的元素,所以有时一个列表中有数给我们想删除的相同元素,我们为了不用一个一个的写,所以用循环来减少冗余,简化代码。但是初学者在写代码的时候总会出现许许多多的问题:
对于下面的这个代码来说:
list1 = [20, 20, 1, 20, 22, 20]
for x in list1:
if x == 20:
list1.remove(x)
print("最终list1的结果是:", list1)
我们希望得到的结果是:
最终list1的结果是: [1, 22]
但是实际上我们得到的答案是:
最终list1的结果是: [1, 22, 20]
问题分析:
这里对于代码出现的错误,我们用调试取断点的方式,有的同学不会,会的同学也不一定看得懂,所以这里我们就直接用代码来体现
list1 = [20, 20, 1, 20, 22, 20]
for x in list1:
if x == 20:
list1.remove(x)
print(list1)
print("最终list1的结果是:", list1)
[20, 1, 20, 22, 20]
[1, 20, 22, 20]
[1, 22, 20]
最终list1的结果是: [1, 22, 20]
从这个remove的过程来看是20放在最后,但是最后却没有删除
假设我们在中间再插入一个20时
list1 = [20, 20, 1, 20, 20, 22, 20]
for x in list1:
if x == 20:
list1.remove(x)
print(list1)
print("最终list1的结果是:", list1)
我们这次得到的结果是:
[20, 1, 20, 20, 22, 20]
[1, 20, 20, 22, 20]
[1, 20, 22, 20]
最终list1的结果是: [1, 20, 22, 20]
发现22前面的也没有删除,循环也只执行了3次,对于我们新列表中5个只执行了3次,所以完全不满足要求就停止循环了
原因分析:
在python中,用remove()对列表进行增删元素之后,会对其他元素进行相应移动。
知道原理后,我们对最初的代码循环分析
第一次循环时,x == 20, 所以remove,列表为[20, 1, 20, 21, 20]
第二次循环时,x == 1,这里应该时不删除的,但是从结果看是将[20, 1, 20, 21, 20]第一个20删除了,我认为是此时运行出问题,删错了,此时列表为[1, 20, 21, 20]
第三次循环时,x ==21, 这里应该也不删除,但是[1,20,21,20]下标为1的20被删除了,与第二次原因我认为是相同的,此时列表[1, 21, 20]
第四次循环,看下标为3,这里没有下标为3了(for循环列表是按下标一次取元素的,这里也为看上面不懂同学解释原因),直接停止循环,所以看见了,列表最终删除结果就为[1, 21, 20]也就解释了上面说的为什么循环次数不满足应该要删除次数的原因。
附上测试代码,方便同学理解:
list1 = [20, 20, 1, 20, 22, 20]
for x in list1:
list1.remove(x)
print(x)
20
1
22
解决方法
1.根据循环的原理,我提出第一个解决方案
list1 = [20, 1, 20, 22, 20]
for x in list1:
if x == 20:
list1.remove(x)
print(list1)
print("最终list1的结果是:", list1)
这里如果不把重复的代码连续放在一起,就不会出现删除不干净的情况
[1, 20, 22, 20]
[1, 22, 20]
[1, 22]
最终list1的结果是: [1, 22]
第一种解决方法就是避免将重复的代码连续放在一起,这种方法看看就行
第二个方法
list1 = [20, 1, 20, 22, 20]
list2 = [] # 这里重新定义个空白列表
for x in list1:
if x != 20:
"""
这里筛选出不要删除的元素
并添加进空白列表
"""
list2.append(x)
# 最后直接输出新列表即可
print(list2)
第三个方法
list1=[20, 1, 20, 22, 20]
for i in range(len(list1)):
"""
这里直接用range函数固定住了list1的长度,不会随remove改变
完美解决问题
"""
if 20 in list1:
list1.remove(20)
print(list1)
这个方法是老师上课讲的,所以上课还是有些用的,哈哈哈
第四个方法
for x in list1:
i = list1.index(20) # 求元素为20的下标
if i != -1: # 说明列表中有20
list1.remove(20)
print(list1)
这里的方法都是本人的总结和理解,希望同学们看了我的文章可以轻松解决问题