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

一、需求:

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

二、问题

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

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

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


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

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

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

输出结果如下:


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

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

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

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


我们可以看出,4 跟 10 是相邻着的,4 的下标是 2,10 的下标是 3,所以当 4 删除之后,datas 中下标为 2 的元素就变成了 10,但是,此时的 for 循环中,datas 的下标是 3 了,所以取不了 10 这个元素,这才导致了 10 没有被删除。

那我们要如何来删除呢?做法是这样的:

三、方法:

方法一:

# 初始化一个 list 列表
datas = [1,3,4,10,5,3,7,6,9,8]# 打印原数组元素,方便对比
print('原 datas 列表的元素为:')
print(datas)# 定义一个空的 list 列表,来储存要删除的 datas 的元素
datas_del = []#使用 for 遍历
for data in datas:# 现在我们需要删除偶数的元素if data % 2 == 0:# 不直接删除,将需要删除的元素,存入 datas_del 中datas_del.append(data)# 打印 datas_del 列表,查看要删除的元素
print('\n打印 datas_del 列表,查看要删除的元素')
print(datas_del)# 再执行一个 for 循环,遍历 datas_del 列表
for data in datas_del:# 删除 datas 中的元素datas.remove(data)# 最后的 datas 列表
print('\n删除后的 datas 的元素为:')
print(datas)

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

方法二:

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

输出结果:


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cpu使用率_漫话性能:CPU使用率

序言CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标。节拍率为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使…

谁动了我的产品

2014年3月中旬离开了自己奋斗三年的公司,这是一家海关政府公司,三年里无论是做项目需求分析、项目开发、项目测试、项目上线实施、项目上线跟踪、收集反馈、做项目版本修改,我和我的团队都在一个有非常明确目标、有非常明确思路的过程中&…

LeetCode 352. 将数据流变为多个不相交区间(map二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非负整数的数据流输入 a1,a2,…,an,…,将到目前为止看到的数字总结为不相交的区间列表。 例如,假设数据流中的整数为 1,3,7,2&…

windows键按了没反应_windows快捷键使用 - 小怜

1、总的参考图:2、ctrl的组合使用:1与shift键结合:2 ctrl shift del # 快速清除浏览器缓存记录3 ctrl shift N # 浏览器当中,快速打开无痕新窗口。chrome内核的应该都可以,chrome和新…

Python倒计时自动发微信(电脑版微信)

一、前言: Python倒计时自动发微信(电脑版微信登录状态) 二、主要思路及步骤: 1、先启动微信 2、定位到搜索框 3、搜索微信 4、进入聊天窗口 5、粘贴文本内容 6、发送 7、关闭微信窗口 三、代码: import …

win10主题更换_还不升级? win10精简版不到10G,运行比win7还快,旧电脑的福音

即使现在win7系统已经停止了服务,但是还有许多人宁愿面对随时有可能出现问题的win7,还是不愿升级win10系统。至于原因,五花八门,比如win7兼容性和稳定性更好,比如win10经常更新,还有许多软件无法在win10环境…

LeetCode 1732. 找到最高海拔

文章目录1. 题目2. 解题1. 题目 有一个自行车手打算进行一场公路骑行,这条路线总共由 n 1 个不同海拔的点组成。 自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i 1 的 净海拔高度差&#xff0…

小案例:利用python估算最外轮廓区域面积

一、需求: 给出一张图片,估算最外轮廓区域面积 二、步骤: 1、读取图片信息 2、利用open-cv,自适应分割图片 3、提取最外轮廓像素值 4、利用像素值标记轮廓 5、计算轮廓面积 三、代码: import cv2# 读取图片信息…

ApplicationContext容器的设计原理

1.在ApplicationContext容器中,我们以常用的FileSystemXmlApplicationContext的实现为例来说明ApplicationContext容器的设计原理。 2.在FileSystemXmlApplicationContext的设计中,我们看到ApplicationContext应用上下文的主要功能已经在FileSystemXmlAp…

使用c++查看linux服务器某个进程正在使用的内存_Linux 系统管理

1、进程管理介绍什么是进程程序是人使用计算机语言编写的,可以实现一定功能,并且可以执行的代码集合进程是正在执行当中的程序。程序在执行时,执行人的权限和属性、以及程序的代码都会被加载进内存,操作系统给这个进程分配一个 ID…

小案例:利用Python写个教师常用的点名软件

一、需求: 教师上课常用的点名软件 二、python库安装: openpyxl是Python中用于读写excel文件tkinter是Python中GUI编程非常好用的库,而且是标准库,不需要安装,导入即可使用random库是Python中用于实现随机功能的库&…

python contains类似函数_01--实际工作中,python基础理念和数据处理

1.工作中遇到的python坑1.1 合并文件问题:正常将文件依次读取并append时,莫名出现很多空行。解决:在append前删除空行:data_tmp 1.2 重复数据行问题: append多日文件时,由于人工误操作,容易存在…

小案例:利用Python实现图片上下、左右翻转

一、前言需求: 对图片进行操作,使图片上下、左右翻转 二、函数库: 使用Pillow模块提供的transpose()方法可以让图像翻转,上下翻转,或者左右翻转 三、操作说明: 原图如下: 图片上下翻转代码…

LeetCode 1736. 替换隐藏数字得到的最晚时间

文章目录1. 题目2. 解题1. 题目 给你一个字符串 time ,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。 有效的时间为 00:00 到 23:59 之间的所有时间,包括 00:00 和…

【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)...

目录: 【SSH进阶之路】Struts基本原理 实现简单登录(二) 【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三) 【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径&#xff08…

实用工具:推荐Pycharm常用的几款插件

相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的,今天来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升。 Pycharm插件安装教程 打开file---settings---plugins&#xff0c…

dataframe 添加一行_R语言Data Frame数据框常用操作

来源 | R友舍Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的。Data Frame每一列有列名,每一行也可以指定行名。如果不指…

LeetCode 1737. 满足三条件之一需改变的最少字符数(计数)

文章目录1. 题目2. 解题1. 题目 给你两个字符串 a 和 b ,二者均由小写字母组成。 一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。 操作的最终目标是满足下列三个条件 之一 : a 中的 每个字母 在字母表中 严格小于 b 中…

oracle对查询结果求和_oracle基础知识分享

原文链接:https://page.om.qq.com/page/OO2PXCD6VZ6CVqLqjpU6uShg0以下是本人整理的ORACLE学习的一些基本的语法知识,如有不对的地方,望大家批评指正,如有转载请注明出处:一、ORACLE完整性约束:1.NOT NULL …

Docker官方案例学习

下面以官方的一个demo学习学习。。。 1、进入windows版docker界面,新建文件夹pp 2、进入pp,在目录下新建三个文件 dockerfile.txt,app.py,requirements.txt 2.1 dockerfile文件 # Use an official Python runtime as a parent…