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使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
详解TensorFlow查看ckpt中变量的几种方法
Jun 19 Python
python实现linux下抓包并存库功能
Jul 18 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
python @classmethod 的使用场合详解
Aug 23 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
keras用auc做metrics以及早停实例
Jul 02 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
python3 中使用urllib问题以及urllib详解
Aug 03 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
Python基础之数据类型知识汇总
May 18 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 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修改时间格式的代码
2011/05/29 PHP
php文档更新介绍
2011/07/22 PHP
php解析json数据实例
2014/08/19 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
jquery 笔记 事件
2011/11/02 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
angularJS 入门基础
2015/02/09 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python实现三次样条插值
2018/12/17 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
解决Django no such table: django_session的问题
2020/04/07 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
一套软件开发工程师笔试题
2015/05/18 面试题
平面设计岗位职责
2013/12/14 职场文书
大雁塔英文导游词
2015/02/10 职场文书
撤诉状格式范本
2015/05/19 职场文书
圣诞晚会主持词
2015/07/01 职场文书
情况说明书怎么写
2015/10/08 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python
Ajax实现异步加载数据
2021/11/17 Javascript