python 安全地删除列表元素的方法


Posted in Python onMarch 16, 2022

前言:

看似简单的任务,往往隐藏陷阱!

一个常见的任务是在一个列表上迭代,并根据条件删除一些元素。本文将展示如何完成该任务的不同方法,同时展示一些需要避免的陷阱。

假设我们需要修改列表a,并且必须删除所有不是偶数的项。

首先实现辅助函数even(x)来确定一个数字x是否是偶数:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0

方法1: 创建新列表,过滤元素

1a) 列表推导,创建新列表

使用列表推导创建一个新的列表,只包含你不想删除的元素,并把它分配回a:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 列表推导,但创建了一个新的变量a
a = [x for x in a if not even(x)]
# --> a = [1, 3]
print(a)

1b) 列表推导,对a[:]赋值

上面的代码创建了一个新的变量a。我们也可以通过赋值给切片a[:]就地改变现有的列表。这种方法更有效率,如果有其他对a的引用需要反映变化的话,这种方法可能很有用。

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 列表推导,但赋值给a[:] 就地改变列表
a[:] = [x for x in a if not even(x)]
# --> a = [1, 3]
print(a)

1c) 使用itertools.filterfalse()

itertools模块为非常有效的循环迭代提供了各种函数,并且提供了一种过滤元素的方法。

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 通过itertools 快速过滤
from itertools import filterfalse
a[:] = filterfalse(even, a)
# --> a = [1, 3]
print(a)

方法2:列表副本上迭代

如果你真的想保留for语法,那么需要在列表的副本上进行迭代(副本可以通过使用a[:]简单创建)。

现在你可以在条件为True时从原始列表中删除元素:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 注意是在列表副本a[:] 上循环
for item in a[:]:
    if even(item):
        a.remove(item)
# --> a = [1, 3]
print(a)

常见陷阱

千万别在同一个列表上循环,并在迭代过程中修改它!

这和上面的代码是一样的,只是没有在副本上循环。删除一个元素将使所有后续元素向左移动一个位置,因此在下一次迭代中,一个元素将被跳过。

这可能会导致不正确的结果:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 直接在变量a上进行循环,没有在副本上
for item in a:
    if even(item):
        a.remove(item)
# --> a = [1, 2, 3] !!!
print(a)

另外,在列表的循环过程中,千万不要修改索引!

这是不正确的,因为在循环中改变i不会影响下一次迭代中i的值。这个例子也会产生非预期的效果,甚至会导致IndexErrors

比如这里:

a = [1, 2, 2, 3, 4]
def even(x):
    return x % 2 == 0
 
# 试图在循环在改变索引i,但出错!
for i in range(len(a)):
    if even(a[i]):
        del a[i]
        i -= 1
# --> IndexError: list index out of range
print(a)

到此这篇关于python 安全地删除列表元素的方法的文章就介绍到这了,更多相关python 删除列表元素内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python之模拟鼠标键盘动作具体实现
Dec 30 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
你真的了解Python的random模块吗?
Dec 12 Python
对python中的xlsxwriter库简单分析
May 04 Python
浅谈python之新式类
Aug 12 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
python装饰器常见使用方法分析
Jun 26 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
python根据文本生成词云图代码实例
Nov 15 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 Python
python turtle绘制多边形和跳跃和改变速度特效
Python中的turtle画箭头,矩形,五角星
Mar 16 #Python
Python学习之异常中的finally使用详解
Mar 16 #Python
Python实现抖音热搜定时爬取功能
Mar 16 #Python
Python3的进程和线程你了解吗
Mar 16 #Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 #Python
bat批处理之字符串操作的实现
Mar 16 #Python
You might like
PHP 一个随机字符串生成代码
2010/05/26 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
Google 静态地图API实现代码
2010/11/19 Javascript
javascript中的一些注意事项 更新中
2010/12/06 Javascript
jQuery的学习步骤
2011/02/23 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
Python中的Matplotlib模块入门教程
2015/04/15 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
Python PIL图片添加字体的例子
2019/08/22 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
python ETL工具 pyetl
2020/06/07 Python
python调用百度API实现人脸识别
2020/11/17 Python
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
PHP面试题及答案二
2015/05/23 面试题
高三历史教学反思
2014/01/09 职场文书
逃课上网检讨书
2014/02/20 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
python缺失值的解决方法总结
2021/06/09 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL