Python遍历列表时删除元素案例

作者:程序员老华 时间:2023-09-03 16:08:09 

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

标签:Python,遍历,列表,删除,元素
0
投稿

猜你喜欢

  • python获得两个数组交集、并集、差集的方法

    2022-08-12 18:37:31
  • PyQt与pycharm的结合使用教程

    2022-09-08 06:47:05
  • Python实现扫码工具的示例代码

    2022-07-06 06:06:36
  • PHP面向对象程序设计继承用法简单示例

    2023-11-22 08:09:42
  • 对架构师的建议:博学笃志,切问近思

    2009-09-25 12:55:00
  • VS 2010 Ultimate架构代码探索

    2010-05-02 20:38:00
  • Docker实践之python应用容器化

    2023-06-07 03:29:43
  • numpy和tensorflow中的各种乘法(点乘和矩阵乘)

    2022-01-18 05:17:10
  • 详解Python中的文件操作

    2022-08-26 03:35:18
  • flask框架自定义过滤器示例【markdown文件读取和展示功能】

    2023-03-07 19:22:27
  • Python Asyncio模块实现的生产消费者模型的方法

    2022-02-10 16:13:49
  • document.createElement()用法及注意事项

    2008-04-21 15:16:00
  • python项目打包成exe和安装包的方法步骤

    2023-06-29 08:37:21
  • 使用python爬虫获取黄金价格的核心代码

    2023-11-03 22:55:28
  • 通过表单的做为二进制文件上传request.totalbytes提取出上传的二级制数据

    2011-03-16 10:39:00
  • 使用Python防止SQL注入攻击的实现示例

    2022-02-09 05:28:24
  • django 前端页面如何实现显示前N条数据

    2023-06-07 10:50:33
  • Django 生成登陆验证码代码分享

    2021-07-31 06:48:21
  • python如何实现质数求和

    2023-03-02 20:17:24
  • python数据类型_字符串常用操作(详解)

    2023-10-12 05:02:57
  • asp之家 网络编程 m.aspxhome.com