• python3 list 使用 for 遍历,边循环边删除问题


    今天由于要对一个 list 数据类型写一个循环删除的程序(这是小编第一次对于 list 操作),但发现一个奇异问题,来,我们来看看代码跟效果:

     1 # 初始化一个 list 列表,为了下边的方便比较,我就使用跟 list 索引来做 list 的元素
     2 datas = [0,1,2,3,4]
     3 
     4 # 打印元素组,方便比较
     5 print(datas)
     6 
     7 #使用 for 遍历
     8 for data in datas:
     9 
    10     # 删除 list 中的元素
    11     datas.remove(data)
    12 
    13 # 打印删除后的数组
    14 print(datas)

    我们来看这一段代码,最后的输出结果,按照我以前的经验,应该是一个空的 [] ,但结果不是:

    上面的结果却告诉我们,上面的程序只删除了三个元素,并没有全部删除完,为什么呢?从上面的结果中,我们可以看出,删除的元素是 1,3,5,从这我们可以看出,原来,是 list 在 for 循环中的索引问题,我们来实时跟踪一下 list 列表在 for 中的变化:

     1 # 初始化一个 list 列表,为了下边的方便比较,我就使用跟 list 索引来做 list 的元素
     2 datas = [0,1,2,3,4]
     3 
     4 # 打印元素组,方便比较
     5 print(datas)
     6 
     7 # 记录是第几次 for 循环
     8 index = 1
     9 
    10 # 记录 datas 当前循环的下标值
    11 i = 0
    12 
    13 #使用 for 遍历
    14 for data in datas:
    15 
    16     # 打印循环次数
    17     print('
    这是第 %d 次循环,datas 当前在 for 循环中的下标值为:%d,删除前 datas 的元素为:' %(index, i))
    18 
    19     # 实时打印 datas 列表
    20     print(datas)
    21 
    22     # 删除 list 中的元素
    23     datas.remove(data)
    24 
    25 
    26     # 循环次数+1
    27     index += 1
    28 
    29     # 索引 +1
    30     i += 1
    31 
    32 # 最后的 datas 列表
    33 print('
    循环结束,最后的 datas 的元素为:')
    34 print(datas)

    输出结果如下:

    如上图可以看出,在 for 循环中 datas 没删除一个元素,它的索引都会变化,但 for 循环中遍历的索引,总会加 1 ,所以,就会出现以上这种跳过性删除的情况。对于这种情况,小编自己想到了一个方法,我们先来看看下面的这一段程序:

     1 # 初始化一个 list 列表
     2 datas = [1,3,4,10,5,3,7,6,9,8]
     3 
     4 #使用 for 遍历
     5 for data in datas:
     6 
     7     # 现在我们需要删除偶数的元素
     8     if data % 2 == 0:
     9 
    10         # 删除 datas 中的元素
    11         datas.remove(data)
    12 
    13 # 最后的 datas 列表
    14 print('
    循环结束,最后的 datas 的元素为:')
    15 print(datas)

    我们来看看这段代码的运行结果:

    我们可以看出,4 跟 10 是相邻着的,4 的下标是 2,10 的下标是 3,所以当 4 删除之后,datas 中下标为 2 的元素就变成了 10,但是,此时的 for 循环中,datas 的下标是 3 了,所以取不了 10 这个元素,这才导致了 10 没有被删除。那我们要如何来删除呢?小编的做法是这样的:

     1 # 初始化一个 list 列表
     2 datas = [1,3,4,10,5,3,7,6,9,8]
     3 
     4 # 打印原数组元素,方便对比
     5 print('原 datas 列表的元素为:')
     6 print(datas)
     7 
     8 # 定义一个空的 list 列表,来储存要删除的 datas 的元素
     9 datas_del = []
    10 
    11 #使用 for 遍历
    12 for data in datas:
    13 
    14     # 现在我们需要删除偶数的元素
    15     if data % 2 == 0:
    16 
    17         # 不直接删除,将需要删除的元素,存入 datas_del 中
    18         datas_del.append(data)
    19 
    20 # 打印 datas_del 列表,查看要删除的元素
    21 print('
    打印 datas_del 列表,查看要删除的元素')
    22 print(datas_del)
    23 
    24 # 再执行一个 for 循环,遍历 datas_del 列表
    25 for data in datas_del:
    26 
    27     # 删除 datas 中的元素
    28     datas.remove(data)
    29 
    30 # 最后的 datas 列表
    31 print('
    删除后的 datas 的元素为:')
    32 print(datas)

    现在我们来执行以下上面的这段代码,是否已经可以成功的删除所要删除的元素,我们看看结果:

    从上面的结果可知,我们已经成功的将我们所需要的元素删除了,这就是小编自己想到的方法。

    注:小编觉得这个方法不好,因为多了一个 for 循环的消耗,小编认为一定还有更好的方法,待小编去询问大神之后,再来更新这篇文档,如果有各位朋友有更好的办法,也可以在评论区告诉小编 ~

  • 相关阅读:
    shell 数组遍历加引号和不加引号的区别?
    shell map数据结构的实现
    PyCharm 项目打开窗口设置为当前还是新开一个怎么办?
    python 模拟ssh 登录远程服务器
    python 字节码死磕
    docker相关内容
    Windows7安装 docker-compose的过程
    史上最简单的Docker入门教程
    MySQL触发器使用详解
    存储过程
  • 原文地址:https://www.cnblogs.com/kafeixiaoluo/p/8543851.html
Copyright © 2020-2023  润新知