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实现求最长回文子串长度
Jan 22 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
详解python使用turtle库来画一朵花
Mar 21 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
使用K.function()调试keras操作
Jun 17 Python
Python __slots__的使用方法
Nov 15 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php下使用iconv需要注意的问题
2010/11/20 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
js三种排序算法分享
2012/08/16 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
python实现的简单窗口倒计时界面实例
2015/05/05 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
python3爬取各类天气信息
2018/02/24 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
零基础学python应该从哪里入手
2020/08/11 Python
python3让print输出不换行的方法
2020/08/24 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
公务员职业生涯规划书范文  
2014/01/19 职场文书
大学社团活动总结
2014/04/26 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
报效祖国演讲稿
2014/09/15 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
社保转移委托书范本
2014/10/08 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript