• 问题总结:一个 list 使用 for 遍历,边循环边删除的问题


    一、需求:

    对一个 list 数据类型写一个循环删除的程序

    二、问题

    来,我们来看看代码跟效果:

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

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


    上面的结果却告诉我们,上面的程序只删除了三个元素,并没有全部删除完,为什么呢?

    从上面的结果中,我们可以看出,删除的元素是 1,3,5,从这我们可以看出,原来,是 list 在 for 循环中的索引问题,我们来实时跟踪一下 list 列表在 for 中的变化:

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

    输出结果如下:


    如上图可以看出,在 for 循环中 datas 没删除一个元素,它的索引都会变化,但 for 循环中遍历的索引,总会加 1 ,所以,就会出现以上这种跳过性删除的情况。

    对于这种情况,想到了一个方法,我们先来看看下面的这一段程序:

    1. # 初始化一个 list 列表
    2. datas = [1,3,4,10,5,3,7,6,9,8]
    3. #使用 for 遍历
    4. for data in datas:
    5. # 现在我们需要删除偶数的元素
    6. if data % 2 == 0:
    7. # 删除 datas 中的元素
    8. datas.remove(data)
    9. # 最后的 datas 列表
    10. print('\n循环结束,最后的 datas 的元素为:')
    11. 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. print('原 datas 列表的元素为:')
    5. print(datas)
    6. # 定义一个空的 list 列表,来储存要删除的 datas 的元素
    7. datas_del = []
    8. #使用 for 遍历
    9. for data in datas:
    10. # 现在我们需要删除偶数的元素
    11. if data % 2 == 0:
    12. # 不直接删除,将需要删除的元素,存入 datas_del 中
    13. datas_del.append(data)
    14. # 打印 datas_del 列表,查看要删除的元素
    15. print('\n打印 datas_del 列表,查看要删除的元素')
    16. print(datas_del)
    17. # 再执行一个 for 循环,遍历 datas_del 列表
    18. for data in datas_del:
    19. # 删除 datas 中的元素
    20. datas.remove(data)
    21. # 最后的 datas 列表
    22. print('\n删除后的 datas 的元素为:')
    23. print(datas)

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

    方法二:

    1. # 初始化一个 list 列表
    2. datas = [1,3,4,10,5,3,7,6,9,8]
    3. # 打印原数组元素,方便对比
    4. print('原 datas 列表的元素为:')
    5. print(datas)
    6. # 定义一个空的 list 列表,来储存要删除的 datas 的元素
    7. datas_del = []
    8. #使用 for 遍历
    9. #[:]作用相当于拷贝了一份
    10. for data in datas[:]:
    11. # 现在我们需要删除偶数的元素
    12. if data % 2 == 0:
    13. # 不直接删除,将需要删除的元素,存入 datas_del 中
    14. datas.remove(data)
    15. print('\n删除后的 datas 的元素为:')
    16. print(datas)

    输出结果:


    从上面的结果可知,我们已经成功的将我们所需要的元素删除了。

  • 相关阅读:
    【剑指Offer】21.调整数组顺序使奇数位于偶数前面
    科学素养题(2022年2月-2022年10月)
    SpringBoot社区小区物业管理停车场系统(Java+Layui+MyBatis+Python+Mysql)
    Python正则表达式
    web前端三大主流框架
    【浅谈DBA 最重要的素质---读书笔记】
    行列转换:MySQL中的数据变形魔法
    常用免费网站总结(自用)
    Git-flow 一个简单高效的Git工作流
    通知!7月SCI/SSCI/EI目录已更新,大批中科院1-4区好刊,请查收!
  • 原文地址:https://blog.csdn.net/xun527/article/details/126420981