Python遍历列表时删除元素案例
作者:程序员老华 发布时间:2023-09-03 16:08:09
标签:Python,遍历,列表,删除,元素
tk在科学养猪群里问bluerust、scz是否碰上过这个Python坑,
示例1:
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5' ]
for ba in bas :
print( ba )
if ( ba.find( 'ba' ) != -1 ) :
bas.remove( ba )
print( bas )
print( bas )
即遍历list的过程中动态删除元素。
上述代码输出如下:
ba1
['ba2', 'ba3', 'ba4', 'ba5']
ba3 // ba2被跳过去了
['ba2', 'ba4', 'ba5']
ba5 // ba4被跳过去了
['ba2', 'ba4']
['ba2', 'ba4'] // 列表未删干净
对示例1做点改动,
示例2:
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5' ]
for i in range( len( bas ) ) :
print( i )
print( bas[i] )
if ( bas[i].find( 'ba' ) != -1 ) :
del bas[i]
print( bas )
print( bas )
上述代码输出如下:
0
ba1
['ba2', 'ba3', 'ba4', 'ba5']
1
ba3
['ba2', 'ba4', 'ba5']
2
ba5
['ba2', 'ba4']
3
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
IndexError: list index out of range
['ba2', 'ba4']
循环变量i只递增到3,进而抛出IndexError。
该坑的起因是,for循环中i的取值从最开始就固定了,实际上要求list在for循环中保持不变;遍历list的过程中动态删除元素,导致list发生变化,而i仍固执地按原计划递增遍历list,于是漏删元素、索引越界。
对此,wzhvictor给了5种解决方案。
方式1,利用filter函数
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
bas = list( filter( lambda ba:ba.find( 'ba' ) == -1, bas ) )
print( bas )
方法2,重新构造list
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
bas = [ba for ba in bas if ba.find( 'ba' ) == -1]
print( bas )
方法3,遍历list的拷贝,对原始list进行删除操作
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
for ba in bas[:] :
if ( ba.find( 'ba' ) != -1 ) :
bas.remove( ba )
print( bas )
方法4
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
for ba in bas[:] :
if ( ba.find( 'ba' ) != -1 ) :
bas.remove( ba )
print( bas )
方法5,倒序遍历
bas = [ 'ba1', 'ba2', 'ba3', 'ba4', 'ba5', 'tk' ]
for i in range( len( bas )-1, -1, -1 ) :
if ( bas[i].find( 'ba' ) != -1 ) :
del bas[i]
print( bas )
就tk的示例1而言,方法4其实不适用,方法4适合从list中删除所有特定值。
这个坑我没踩过,用过方法2、3、4或者它们的变种。没像wzhvictor那样细究过for循环中i取值从最开始就固定,但我本能地对循环中动态处理的对象不放心,又懒得看Python文档,所以要么重新构造list,要么复制list再操作,完美避坑。今日看了wzhvictor的文章,方法1没用过,方法5没想过,方法5比较骚包,我第一次见。
Python表面上的不确定性真多,也没啥大不了,我的经验是,能用简明直观确定性的写法,就不要骚包玩花活,性能优化是后话。再就是,单元测试,无需再多强调。
来源:https://blog.csdn.net/m0_72557783/article/details/126712669
0
投稿
猜你喜欢
- ASP+Access数据库的18条安全法则:1.首先,我们需要过滤所有客户端提交的内容,其中包括?id=N一类,另外还有提交的html代码中
- 如下所示:# -*- coding: utf-8 -*-# @Time : 2018/1/17 16:37# @Author :
- Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为:def 函数名(参数1, 参数2, ……, 参数N):执行语
- 深入认识Python内建类型——dict注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因
- 前言:时间戳的定义Unix时间戳(Unix时间戳)或称Unix时间(Unix时间),POSIX时间(POSIX时间),是一种时间表示方式,定
- 项目github地址:bitcarmanlee easy-algorithm-interview-and-practice1.Python中
- 事情是这样的,笔者在使用docx库的时候遇到了文字的缩进问题,具体需求是:正文内容每段首行顶两格,也就是向右缩进两个字符,像这样:需求看似很
- 一、普通进度条import sysimport time# 普通进度条# 在代码迭代运行中进行统计计算,并使用格式化字符串输出代码运行进度d
- 为什么要使用滤波消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感
- python 是一门优雅的语言,有些使用方法就像魔法一样。装饰器(decorator)就是一种化腐朽性为神奇的技巧。最近一直都在使用 Tor
- 有时候需要在终端显示彩色的字符,即根据需要显示不同颜色的字符串,比如我们要在终端打印一行错误提示信息,要把它弄成红色的。其实这个在Pytho
- 相关代码如下: 1. 创建sequence: 代码如下:CREATE SEQUENCE SEQU_DATA_DATAINFO IN
- 我们都知道python的版本不同,在使用的时候就有所区别。鉴于我们推荐小伙伴们选择python3版本,所以这方面的区别了解的不是很多。就拿_
- 零、本讲学习目标了解面向对象编程思想掌握类和对象的定义和使用了解Python中的对象一、面向对象(一)程序员“面向对象”在现实世界中存在各种
- 一、上传表单的HTML代码 <form action="UpLoad.php" method="post
- 一、相关模块jieba:中文分词wordcloud :Python词云库imageio:读取图形数据安装:pip install&
- 一:建立对象引用计数1. 相关代码void_Py_NewReference(PyObject *op){ if (
- 异常的传递性在 Python 中,异常的传递性指的是,当一个异常没有被处理时,它会沿着调用栈向上抛出,直到被处理或者导致程序崩溃。具体来说,
- Inotify地址:访问# -*- coding:utf-8 -*-import osimport pyinotifyfrom functi
- 大大小小也搞过一些数据库设计,见过一些其他人的设计,看过些书,总结总结,经验谈。选表类型:大家都知道mysql的myisam表适合读操作大,