python 的列表遍历删除实现代码


Posted in Python onApril 12, 2020

python的列表list可以用for循环进行遍历,实际开发中发现一个问题,就是遍历的时候删除会出错,例如

l = [1,2,3,4]
for i in l:
 if i != 4:
 l.remove(i)
print l

这几句话本来意图是想清空列表l,只留元素4,但是实际跑起来并不是那个结果。再看下面,利用index来遍历删除列表l

l = [1, 2, 3, 4]
for i in range(len(l)):
 if l[i] == 4:
 del l[i]

print l

这样没问题,可以遍历删除,但是列表l如果变为 l = [1,2,3,4,5]
如果还是按照上面的方法,设想一下,range开始的范围是0-4,中间遍历的时候删除了一个元素4,这个时候列表变成了= [1,2,3,5],这时候就会报错了,提示下标超出了数组的表示,原因就是上面说的遍历的时候删除了元素

所以python的list在遍历的时候删除元素一定要小心
可以使用filter过滤返回新的list

l = [1,2,3,4]
l = filter(lambda x:x !=4,l)
print l

这样可以安全删除l中值为4的元素了,filter要求两个参数,第一个是规则函数,第二个参数要求输入序列,而lambda这个函数的作用就是产生一个函数,是一种紧凑小函数的写法,一般简单的函数可以这么些

或者可以这样

l = [1,2,3,4]
l = [ i for i in l if i !=4]//同样产生一个新序列,复值给l
print l

或者干脆建立新的list存放要删除的元素

l = [1,2,3,4]
dellist = []
for i in l:
 if i == 4:
 dellist.append(i)
for i in dellist:
 l.remove(i)

这样也能安全删除元素

所以要遍历的时候删除元素一定要小心,特别是有些操作并不报错,但却没有达到预期的效果
上面说到产生新序列,赋值等等,用python的id()这个内置函数来看对象的id,可以理解为内存中的地址,所以有个简要说明

如果

l = [1,2,3,4]
ll = l
l.remove(1)
print l//肯定是[2,3,4]
print ll//这里会是什么?

如果用id函数查看的话就发现

print id(l),id(ll)

打印出相同的号码,说明他们其实是一个值,也就是说上面的print ll将和l打印的一样,所以python有这种性质,用的时候注意一下就行了

一般python书中会讲到这个问题
遍历的时候如果想更新列表本身
推荐的做法是使用切片

l = [1, 2, 3, 4]
for i in l[:]
some code

python中循环删除列表中元素时的坑!

循环删除列表中元素时千万别用正序遍历,一定要用反序遍历!

废话不多说,先上案例代码:

def test(data):
  for i in data:
    data.remove(i)
  return data
data = [1, 2, 3]
print(test(data))

面对以上代码,乍一看以为会打印出空列表,因为test函数内通过for的方法将data中的元素都删除了,其实不然,实际输出如下:

[2]

为什么会产生这种结果呢? 我们来深度剖析一下:

原列表在内存中为:

python 的列表遍历删除实现代码

第一次执行到data.remove(i)时将第一个元素‘1'删除,列表变为:

python 的列表遍历删除实现代码

第二次执行到data.remove(i)时i为第二个元素,即‘3',此时将‘3'删除,列表变为:

python 的列表遍历删除实现代码

此时列表已经没有第三个元素了,即退出循环,将[2]返回。

如何解决这个问题呢? 我们可以用倒序删除的方法!

直接上代码:

def test(data):
  for i in data[::-1]:
    data.remove(i)
  return data


data = [1, 2, 3]
print(test(data))

此时再运行,发现输出结果为空列表

[]

倒序删除原理如下:

原列表在内存中为:

python 的列表遍历删除实现代码

第一次执行到data.remove(i)时是将倒数第一个元素‘3'删除,列表变为:

python 的列表遍历删除实现代码

第二次执行到data.remove(i)时i为倒数第二个元素,即‘2',此时将‘2'删除,列表变为:

python 的列表遍历删除实现代码

第三次执行到data.remove(i)时i为倒数第三个元素,即‘1',此时将‘1'删除,列表变为空列表!

总结:正序删除列表中元素时,被删元素后面的值会向前顶,然后导致漏删。倒序删除元素时,被删元素前面的值不会向后靠,所以可以完整的遍历到列表中所有的元素。

Python 相关文章推荐
详解Python验证码识别
Jan 25 Python
Django Admin实现上传图片校验功能
Mar 06 Python
python 打印对象的所有属性值的方法
Sep 11 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
Python 导入文件过程图解
Oct 15 Python
详解Python设计模式之策略模式
Jun 15 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
python matlab库简单用法讲解
Dec 31 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 #Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 #Python
python实现将内容分行输出
Nov 05 #Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 #Python
Python实现周期性抓取网页内容的方法
Nov 04 #Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 #Python
python通过文件头判断文件类型
Oct 30 #Python
You might like
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP 使用二进制保存用户状态的实例
2018/01/29 PHP
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
javascript操作cookie
2017/01/17 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
2018/11/06 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
深入解析Python编程中JSON模块的使用
2015/10/15 Python
基于python的字节编译详解
2017/09/20 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
建筑施工员岗位职责
2013/11/26 职场文书
期末自我鉴定
2014/01/23 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
小学生毕业评语
2014/12/26 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python
TS 类型兼容教程示例详解
2022/09/23 Javascript