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 错误和异常小结
Oct 09 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
Python常用内置模块之xml模块(详解)
May 23 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
PyQt5实现拖放功能
Apr 25 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 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
php 代码优化的42条建议 推荐
2009/09/25 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
你对IPv6了解程度
2016/02/09 面试题
儿科护理实习自我鉴定
2013/09/19 职场文书
师范应届生教师求职信
2013/11/05 职场文书
行政人事岗位职责
2014/03/17 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
市场部岗位职责
2015/02/12 职场文书
法人代表证明书范本
2015/06/18 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
k-means & DBSCAN 总结
2021/04/27 Python
vue动态绑定style样式
2022/04/20 Vue.js