Python---remove在循环中删除不干净(偏移问题)

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)

这里的方法都是本人的总结和理解,希望同学们看了我的文章可以轻松解决问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值