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:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
Python工程师面试必备25条知识点
Jan 17 Python
python增加矩阵维度的实例讲解
Apr 04 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
python多线程抽象编程模型详解
Mar 20 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 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的5个安全措施小结
2012/07/17 PHP
php导入模块文件分享
2015/03/17 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
php语法检查的方法总结
2019/01/21 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
<script defer> defer 是什么意思
2009/05/10 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
python实现异步回调机制代码分享
2014/01/10 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
python字符串连接方法分析
2016/04/12 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
解决Python3下map函数的显示问题
2019/12/04 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
实习生自我鉴定范文
2013/12/05 职场文书
消防安全责任书范本
2014/04/15 职场文书
新农村建设标语
2014/06/24 职场文书
上课不认真检讨书
2014/09/17 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL