首页 > 编程语言 >python中for循环无法删除全部成员

python中for循环无法删除全部成员

时间:2023-07-19 16:34:40浏览次数:43  
标签:slist 下标 删除 python 元素 列表 循环

积涓流之势,成汪洋之姿。


对于列表这种数据容器,对其中元素进行筛选并处理时很容易想到用for循环去逐个处理,还可以叠加上判断语句逐一对列表中的成员进行判断。 介于此,我在遍历列表元素进行判断删除时出现了如下场景:  
问题代码: (s1,s2,s3这三个变量的此时的值为"","","hello-world"   其前面部分代码过于冗长且与出错部分无关,故不再copy)
slist = [s1, s2 ,s3]
for st in slist:
    if st == "":
        slist.remove(st)
return slist

分析出错过程并寻找原因:  

 

(1)这是初试状态,通过在for循环中进行if判断是否为特定字符串(此处为空字符串),如果是进行相应处理。
 

 

(2)此时单步调试正常,使用list.remove(element)找到列表中相应元素(此时为空字符串)并删除,删除了下标为0(注意)的第一个空字符串元素,然后在循环内继续进行判断,如此往复


 

(3)继续单步调试,会发现下一个要判断的元素是“hello—world”,而不是本该被处理原slist的第二个元素""(空字符串),第二个元素直接被跳过了!!!!


 

(4)最后将被处理后的slist列表打印则会发现,原slist中的第二个元素竟然“幸存”下来!for循环难道开了小差,漏了这个老6?


 

笔者也是个萌新宝宝,看到这个结果实在是摸不着头脑,顿时感觉这个世界套路太多,不太友善(咳咳,扯远了)

就在我百思不得其解之际,无意间翻看了csdn其他大佬的学习笔记(链接放在最后,需要自取),终于找到了原因。

原来,for循环在运行过程中,会使用一个指针来标记当前正在处理的元素的位置,而当一个元素(下标为0)被处理完成之后,指针所记录的下标会自动“加一”去处理“下一个”元素,但是此时由于slist列表中的第一个元素被删除,原先的第二的元素变成了第一个元素,此时它的下标减一变成了0,后面的元素以次类推,下标均减一,但是for循环指针的下标并没有跟随这一调整而减一,for循环指针对应得下标值仍然为1,而此时下标为1的元素是初试状态slist列表的第三个元素(初始下标为2,此时应为第一个元素被删除而下标变成了1),所在实际的处理过程中“二号玩家”变成了老6光荣地苟到了最后(原slist列表第二个元素实际上根本没有参与到for循环地遍历过程中,而是由于下标的变动跳出了for循环,未被for循环所处理)


修正及其处理方法:

借鉴链接中提到的方法,我们可以额外采用一个列表(这个用来标记的列表称之为列表2,原列表称为列表1)来专门记录所要删除的元素的下标,而先不对列表1(原列表)进行删除操作,只是查找出所要删除的元素相对应的下标,并记录到列表2中,(此时因为没有元素的增删操作,下标与元素的对应关系一致保持不变),待对列表1全部的元素进行查找、判断、记录后,通过另一个for循环集中进行删除,实验结果如下图所示:

可以看到列表中所有空字符串均被删除,结果打印输出正确

 至于其他的方法笔者还在整理中,待后续补充至此片中来。

 

文中提及的csdn链接:https://blog.csdn.net/weixin_39722188/article/details/111628974

 

 

 

 

 

 

 

标签:slist,下标,删除,python,元素,列表,循环
From: https://www.cnblogs.com/sure-codingspace/p/17565973.html

相关文章

  • python
    目录fastapifastapi下载fastapi依包赖pipinstallfastapi-ihttps://mirrors.aliyun.com/pypi/simple因为fastapi启动依赖于uvicorn,所以我们还需要安装uvicorn。pipinstalluvicorn-ihttps://mirrors.aliyun.com/pypi/simple提供api访问路径验证`fromfastapii......
  • python序列
    *鉴于序列协议的重要性,如果没有__iter__和__contains__方法,Python会调用__getitem__方法,设法让迭代和in运算符可用。#猴子补丁当一个类中缺少某个内置方法导致出现不可迭代或者是不可变对象的时候,可以在类的外面定义一个函数,用这个函数给类打补丁。 ......
  • centos系统中python3 import tkinter报错解决方法
    本人运行的环境是Centos7.9+Python3.6,运行脚本中包含importtkinter。报错如下图: 原因是Linux环境下Python环境没有内置tkinter模块(在windows环境是内置好的,可以直接用)解决方法为手动安装tkinter模块1yuminstallpython3-tkinter安装完成后,再运行tkinter代码就成功了。......
  • 只需1分钟带你了解Python中的协程!
    协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。他本身是一种特殊的子程序或者称作函数。而在Python中,协程是非常重要的概念,也是Python异步IO编程的基础之一。什么是协程?协程是一种用户轻量......
  • go语言操作docker删除容器
    代码部分packagemainimport( "context" "fmt" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client")funcmain(){ //设置远程Docker守护进程的地址 remoteDockerURL:="tcp://10.0.0.1......
  • 5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python
    5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python引言在高考结束后,学生们面临的一大挑战是如何根据自己的分数找到合适的大学。这是一个挑战性的任务,因为它涉及大量的数据和复杂的决策过程。大量的信息需要被过滤和解析,以便学生们能对可能的大学选择有......
  • Sobel edge detector python pytorch
    实现Sobel边缘检测器的PythonPyTorch方法介绍在本文中,我将向你介绍如何使用Python和PyTorch实现Sobel边缘检测器。Sobel边缘检测器是一种经典的计算机视觉算法,用于检测图像中的边缘。通过学习本文,你将了解到整个流程以及每一步所需的代码。流程下面是实现Sobel边缘检测器的整......
  • Python Magic Methods & Operator Overloading All In One
    PythonMagicMethods&OperatorOverloadingAllInOne__init__&__add__MagicMethods__sub__for-__mul__for*__truediv__for/__floordiv__for//__mod__for%__pow__for**__and__for&__xor__for^__or__for|Theexpression......
  • 一个月学会Python的Quora指南和资料放送
    如何一个月学会使用Python文章翻译自Quora上的回帖,略有改动。原文链接:https://www.quora.com/What-are-the-best-tips-for-learning-Python-within-one-month第1周谷歌搜索“Pythonprogrammingfundamentals”(Python编程基础),选择一个较好的网站,并针对其中的教程部分进行阅读......
  • Python日志模块:实战应用与最佳实践
    本文详细解析了Python的logging模块,从基本介绍到实际应用和最佳实践。我们通过具体的代码示例解释了如何高效地使用这个模块进行日志记录,以及如何避免常见的陷阱,旨在帮助读者更好地掌握这个强大的工具。一、Python日志模块简介日志的概念及其在软件开发中的作用在开发过程中,......