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 相关文章推荐
easy_install python包安装管理工具介绍
Feb 10 Python
Django学习笔记之Class-Based-View
Feb 15 Python
python监测当前联网状态并连接的实例
Dec 18 Python
python调用外部程序的实操步骤
Mar 04 Python
Django model update的多种用法介绍
Mar 28 Python
Python socket模块方法实现详解
Nov 05 Python
Python语法之精妙的十个知识点(装B语法)
Jan 18 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
Python list和str互转的实现示例
Nov 16 Python
Python项目打包成二进制的方法
Dec 30 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 Python
python编程的核心知识点总结
Feb 08 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 FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
vue计算属性及使用详解
2018/04/02 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
python封装对象实现时间效果
2020/04/23 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
Linux如何压缩可执行文件
2014/03/27 面试题
工程业务员岗位职责
2013/12/31 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
置业顾问岗位职责
2014/03/02 职场文书
亲子活动总结
2014/04/26 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
失职检讨书大全
2015/01/26 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers