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实现在pickling的时候压缩的方法
Sep 25 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
python安装教程
Feb 28 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
更新修改后的Python模块方法
Mar 03 Python
Python实现FM算法解析
Jun 18 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
python动态视频下载器的实现方法
Sep 16 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 Python
python面向对象版学生信息管理系统
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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
2010年最佳jQuery插件整理
2010/12/06 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
JS 控件事件小结
2012/10/31 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
物流司机岗位职责
2013/12/28 职场文书
《老山界》教学反思
2014/04/08 职场文书
《观舞记》教学反思
2014/04/16 职场文书
推荐信格式要求
2014/05/09 职场文书
企业宣传策划方案
2014/05/29 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
2015年复活节活动总结
2015/02/27 职场文书
学习nginx基础知识
2021/09/04 Servers