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实现rest请求api示例
Apr 22 Python
在Python中使用lambda高效操作列表的教程
Apr 24 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
Python模拟百度自动输入搜索功能的实例
Feb 14 Python
python os.fork() 循环输出方法
Aug 08 Python
python如何实现不用装饰器实现登陆器小程序
Dec 14 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
Mar 13 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
如何用Python进行时间序列分解和预测
Mar 01 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
10条PHP高级技巧[修正版]
2011/08/02 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
Js之软键盘实现(js源码)
2007/01/30 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
Ext 今日学习总结
2010/09/19 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
React实现轮播效果
2020/08/25 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
Python实现端口复用实例代码
2014/07/03 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
python数据结构之列表和元组的详解
2017/09/23 Python
python进行两个表格对比的方法
2018/06/27 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
印尼网上商店:Alfacart.com
2019/03/11 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
医学生自我评价
2014/01/27 职场文书
小小的船教学反思
2014/02/21 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书