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


猜你喜欢
- 最近线上安全扫描到mysql连接器的一个漏洞,看了一下用的是5.1.47的版本,确实挺久了 建议是升级到8.0.27最新版凡是升级
- MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文主要介绍了show命令的主要用
- SQL SERVER 中有四个系统表master, model, msdb,tempdb.这四个表有什么用?一般DB使用中我们开发人员很少去
- package 机制package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下
- 初学python,对python的对齐很重视,为了防止出错,使用spyder工具提供的功能下面是方法:1、首先打开Tools菜单栏下的Pre
- 有很多程序运行时间比较长,如果不将运行过程输出将很难判断程序运行的时间。下边这段程序将按照上图所示的格式输出程序运行进程、已用时间、剩余时间
- 简述从官网下载了Python3.7.4,直接编译安装后,使用pip3出现了报错信息: Can't connect to HTTPS
- 本文实例讲述了Python多继承原理与用法。分享给大家供大家参考,具体如下:python中使用多继承,会涉及到查找顺序(MRO)、重复调用(
- 今天下载wordcloud的时候出现了很多问题,在此总结总结1.问题一:You are using pip version 19.0.3,
- 步骤1、安装Jupyterpip install jupyter2、 新建一个IPython文件3、在Terminal里启动Jupyter
- print 默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号 ,#!/usr/bin/python # -*- coding: UT
- 印象中,以前电脑不发达,自身编程经历不多的时候,由于Microsoft SQL Server版本众多,在不同版本的windows下必须要求装
- 利用Python处理数据时,处理完成后输出结果为二维的列表,如果我们想把这个列表输出到Excel中形成格式化的数据,其实和输出到TXT文件大
- 编写兼容IE和FireFox的脚本确定的件很烦人的事,今日又经历了一次。一、正式表达式问题试图用以下表达式提取中括号“]”后面的内容,连接调
- 开发环境:Ubuntu16.04+Django 1.11.9+Python2.7一:使用自定义函数输出日志到log文件:import tim
- 配置日志在Django中,可以通过logging模块来记录日志。日志记录器是将日志消息传递给日志处理器的对象。当需要记录日志时,可以使用以下
- Typora是什么?Typora是一款支持实时预览的Markdown文本编辑器。支持即时渲染技术,这也是与其他Markdown编辑器最显著的
- 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的errorlog中出现磁盘请求超过15s才完成
- python实现PSO算法优化二元函数,具体代码如下所示:import numpy as np import random import m
- 引言:我们在页面上会看到,谁登录的就会显示谁的信息,那么这个页面上的变量信息是怎样实现的呢?这就是本文要讲述的内容——Django中的模板变