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通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
pandas数值计算与排序方法
Apr 12 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
python 整数越界问题详解
Jun 27 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
Python进度条的制作代码实例
Aug 31 Python
python实现大战外星人小游戏实例代码
Dec 26 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
Python  lambda匿名函数和三元运算符
Apr 19 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
smarty简单入门实例
2014/11/28 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
js单例模式的两种方案
2013/10/22 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
9种python web 程序的部署方式小结
2014/06/30 Python
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
python实现websocket的客户端压力测试
2019/06/25 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
司法局火灾防控方案
2014/06/05 职场文书
宣传口号大全
2014/06/16 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
劳模事迹材料范文
2014/12/24 职场文书
高老头读书笔记
2015/06/30 职场文书