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用reduce和map把字符串转为数字的方法
Dec 19 Python
Python基于动态规划算法解决01背包问题实例
Dec 06 Python
python使用turtle库绘制时钟
Mar 25 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
【python】matplotlib动态显示详解
Apr 11 Python
python集合是否可变总结
Jun 20 Python
简单了解python的break、continue、pass
Jul 08 Python
推荐8款常用的Python GUI图形界面开发框架
Feb 23 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
python开发入门——列表生成式
Sep 03 Python
Python turtle实现贪吃蛇游戏
Jun 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
实用函数2
2007/11/08 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
js本身的局限性 别让javascript做太多事
2010/03/23 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Python装饰器用法与知识点小结
2020/03/09 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
高中数学教师求职信
2013/10/30 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
Java版 简易五子棋小游戏
2022/05/04 Java/Android