python 安全地删除列表元素的方法
作者:程序员涵涵2021 发布时间:2022-11-20 16:21:35
标签:python,删除,列表,元素,方法
前言:
看似简单的任务,往往隐藏陷阱!
一个常见的任务是在一个列表上迭代,并根据条件删除一些元素。本文将展示如何完成该任务的不同方法,同时展示一些需要避免的陷阱。
假设我们需要修改列表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)
来源:https://blog.csdn.net/weixin_56659172/article/details/123475082


猜你喜欢
- Django提供了翻页器。用Django的Paginator类实现一、views模块导入Paginator类实现数据分页ApiTest/ap
- 一、所需工具**Python版本:**3.5.4(64bit)二、相关模块opencv_python模块sklearn模块numpy模块dl
- 函数的迭代器函数的强大功能叫做迭代器,Python里面最具威力的功能之一。迭代器我们听起来会感觉非常陌生,在list、tuple都有用到它,
- 目录前期准备界面编写截图功能实现OCR实现内容显示总结前期准备在这个阶段主要准备整个小程序的结构,既然要实现ocr,那么输入就是一张图片,而
- 如下所示:import numpy as npimport pandas as pdfrom pandas import Series,Da
- 数据结构&Series:'''series {索引 + 数据} 形式索引是自动生成的''
- 本文实例讲述了Python模块结构与布局操作方法。分享给大家供大家参考,具体如下:#coding=utf8#起始行#!/usr/bin/en
- 偶第一次发主题, 这个是在一个项目中的做...写的一般般, 有什么bug之类的是在所难免, 望见谅功能说明:1. 即时控制用户输入2. 将输
- 本文实例讲述了Python实现基于HTTP文件传输的方法。分享给大家供大家参考。具体实现方法如下:一、问题:因为需要最近看了一下通过POST
- 由于卷积神经网络的设计是用于探索图像数据,本节我们将以图像为例。互相关运算严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算
- from sgmllib import SGMLParserimport urllib2class sgm(SGMLParser):&nbs
- Data URIData URI是由RFC 2397定义的一种把小文件直接嵌入文档的方案。通过如下语法就可以把小文件变成指定编码直接嵌入到页
- 本文实例讲述了Python找出序列中出现次数最多的元素。分享给大家供大家参考,具体如下:问题:找出一个元素序列中出现次数最多的元素是什么解决
- 今天写了一个放迅雷焦点广告的效果,还请大家多多指正,先附上效果图一张:相关文章:迅雷首页新闻图片轮播效果js源码首先是JS代码部分,之前一定
- Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的
- 1.安装下载网址:http://phantomjs.org/download.html选择合适的版本。然后解压即可。环境变量的配置:进入解压
- 原始数据和目标数据实现SQL语句(最大)selectshop,month,greatest(dz,fz,sp) as maxfromtabl
- 目录1.在app下的models.py中创建新的模板2.数据迁移(用pycharm自带的Terminal工具即可)3.在app下的views
- 多线程概述多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率。python提供了两个模块来实现多线程thr
- python注释方法方式1单行注释:shift + #(在代码的最前面输入,非选中代码进行注释)多行注释:同单行一样在每一行的前面输入shi