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中执行shell的两种方法总结
Jan 10 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
python reduce 函数使用详解
Dec 05 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
详解django中url路由配置及渲染方式
Feb 25 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
Python将string转换到float的实例方法
Jul 29 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
python装饰器的特性原理详解
Dec 25 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
Python pygame实现中国象棋单机版源码
Jun 20 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 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正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
菜单效果
2006/10/14 Javascript
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python help()函数用法详解
2014/03/11 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
Python中的pack和unpack的使用
2018/03/12 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
Python类的继承super相关原理解析
2020/10/22 Python
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
运动会领导邀请函
2014/02/05 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
飞屋环游记观后感
2015/06/08 职场文书
田径运动会通讯稿
2015/07/18 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis