zoukankan      html  css  js  c++  java
  • python循环删除列表中的元素时遇到的坑

    今天在写测试用例的时候,突然想到之前刚学python时,做过一个循环删除列表中元素的练习题,现在把当时踩的坑总结一下,希望能对大家有所帮助。

    具体的场景是这样的:

     我当时第一次是这么写的:

    这种写法看起来并没什么问题,得到的应该是一个空的列表,其实不然,运行后的结果是这个样子的:

     

     咦?到底是哪里出了问题呢,其实只要去了解一下 for 循环的底层原理,就很容易明白:

    data 这个列表在内存中是这样存储的:

     当第一次执行 for 循环时,默认删除索引为1 的元素,即删除 “卖茶叶”,删除后的列表是:

     当第二次执行 for 循环时,index +1,即删除索引为2 的元素,注意:这时 的 data 已经发生了变化,此时索引为 2 的元素不是“卖面膜” 而是 “卖保险”,删除后的列表是:

     当第三次执行 for循环时,index 在 2的基础上再加1,即删除索引为3,从上面的列表中我们可以看到,索引为 3 的元素是“卖手机”,删除后的列表是:

     第四次执行for 循环时,index 在3的基础上加1,即删除索引为4的元素,而这时的列表只有两个元素了,无法找到索引为4 的元素,即无法执行删除操作,所以会将列表直接打印出来。

    那么,重点来了,怎么解决这个问题呢,仔细想一下,正序删除列表时由于每次删除一个元素后,后面的元素会顶上来,所以导致删不干净,如果我们倒序删除呢,我们来试一下子:

     这次再运行后的结果是:

     竟然真的删掉了,我们再来详细看一下它的原理:

    data 这个列表在内存中是这样存储的:

    第一次执行 for 循环时,由于是倒序所以会默认删除最后一个元素,即“卖手机”,删除后的列表是:

     后面会以此类推,直到把整个列表清空。

    最后,总结一下,在使用for 循环遍历删除列表中的元素时,一定不要用正序去遍历,用反序遍历才能达到将列表中的元素清空。

    最后的最后,再为大家奉上几种其他的方法,也可以达到遍历删除列表中元素的效果哦!

    方法一:注意:pop() 函数默认是删除列表的最后一个元素哦

     方法二:

    哪怕是最没有希望的事情,只要有一个勇敢者去坚持做,到最后就会拥有希望。

  • 相关阅读:
    核心数据类型
    Python入门
    [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)
    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
    [luogu5339] [TJOI2019]唱、跳、rap和篮球(容斥原理+组合数学)(不用NTT)
    用生成函数推导数列的通项公式
    [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)
    [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)
    [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)
    倍增好题记录
  • 原文地址:https://www.cnblogs.com/Cactus-xiaot/p/12783734.html
Copyright © 2011-2022 走看看