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中的ConfigParser模块使用详解
May 04 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
50行Python代码实现人脸检测功能
Jan 23 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
python递归法解决棋盘分割问题
Jul 17 Python
Django框架 querySet功能解析
Sep 04 Python
深入了解Python 变量作用域
Jul 24 Python
Python同时迭代多个序列的方法
Jul 28 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 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提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
javascript 事件绑定问题
2011/01/01 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
简单的分页代码js实现
2016/05/17 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Pycharm安装python库的方法
2020/11/24 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
个人党性剖析材料
2014/02/03 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
教师学期末个人总结
2015/02/13 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
英语读书笔记
2015/07/02 职场文书
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记