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 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
如何利用python制作时间戳转换工具详解
Sep 12 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
利用Python脚本实现自动刷网课
Feb 03 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
python利用xlsxwriter模块 操作 Excel
Oct 14 Python
python实现发送邮件
Mar 02 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 Python
python多次执行绘制条形图
Apr 20 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
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python 开发的三种运行模式详细介绍
2017/01/18 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
python 杀死自身进程的实现方法
2019/07/01 Python
python matplotlib拟合直线的实现
2019/11/19 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
致跳远、跳高运动员广播稿
2014/01/09 职场文书
建筑节能汇报材料
2014/08/22 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
青春雷锋观后感
2015/06/10 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript
详解SQL报错盲注
2022/07/23 SQL Server