在遍历list的时候,删除符合条件的数据,结果不符合预期

num_list = [1, 2, 2, 2, 3]
print(num_list) for item in num_list:
if item == 2:
num_list.remove(item)
else:
print(item) print(num_list)

结果是

[1, 2, 2, 2, 3]
1
[1, 2, 3]

或者有:

num_list = [1, 2, 3, 4, 5]
print(num_list) for i in range(len(num_list)):
if num_list[i] == 2:
num_list.pop(i)
else:
print(num_list[i]) print(num_list)

结果报错:

[1, 2, 3, 4, 5]
Traceback (most recent call last):
1
4
5
File "tes.py", line 5, in <module>
if num_list[i] == 2:
IndexError: list index out of range Process finished with exit code 1

原因是,删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照原来list的长度进行遍历,所以会造成索引溢出。

1.把列表拷贝,然后对原列表进行删除操作就没问题了

num_list = [1, 2, 2, 2, 3]
print(num_list) for item in num_list[:]:
if item == 2:
num_list.remove(item)
else:
print(item) print(num_list)

结果:

[1, 2, 2, 2, 3]
1
3
[1, 3]

num_list[:]是对原始的num_list的一个拷贝,是一个新的list,所以,我们遍历新的list,而删除原始的list中的元素,则既不会引起索引溢出,最后又能够得到想要的最终结果。此方法的缺点可能是,对于过大的list,拷贝后可能很占内存。

2.从后往前遍历列表,删除

3.filter函数

例子 list中去空字符(配合lambda表达式):

condition = lambda t: t != "" (判断符合条件很复杂就不能使用lambda,自己写方法吧)

filter_list = list(filter(condition, list)

Python的List的底层是实现是一个PyObject*数组。如果每次增加一个元素都扩张内存的话效率太低,在增加元素的时候所以会有预申请内存。同理删除元素的时候也不是马上就减小内存空间,他会按照一定的策略减小。而这种减小不太好预测。
再加上删除后索引如何调整并没有明确定义。比如一个长度为3的List你删除了第2个那么第三个下标应该是2还是3,等等可能会引发歧义。如果这个时候内存达到了需要减小的条件,迭代器就不太好判断新的索引究竟是多少。
所以Python为了通用性和安全性考虑就禁止在遍历时删除元素了。

Python遍历列表删除多个列表元素的更多相关文章

  1. python 遍历hadoop, 跟指定列表对比 包含列表中值的取出。

    import sys import tstree fname = 'high_freq_site.list' tree = tstree.TernarySearchTrie() tree.loadDa ...

  2. C#实现在foreach遍历中删除集合中的元素(方法总结)

    目录 方法一:采用for循环,并且从尾到头遍历 方法二:使用递归 方法三:通过泛型类实现IEnumerator 在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致 ...

  3. Java HashMap 如何正确遍历并删除元素

    (一)HashMap的遍历 HashMap的遍历主要有两种方式: 第一种采用的是foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况. HashMap<K ...

  4. 如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)

    遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 其中使用普通for循环容易造成遗漏元素的问 ...

  5. java 中 HashMap 遍历与删除

    HashMap的遍历 方法一.这是最常见的并且在大多数情况下也是最可取的遍历方式 /** * 在键值都需要时使用 */ Map<Integer, Integer> map = new Ha ...

  6. Python遍历列表删除多个元素或者重复元素

    在遍历list的时候,删除符合条件的数据,结果不符合预期   num_list = [1, 2, 2, 2, 3] print(num_list) for item in num_list: if i ...

  7. python遍历列表删除多个元素的坑

    如下代码,遍历列表,删除列表中的偶数时,结果与预期不符. a = [11, 20, 4, 5, 16, 28] for i in a: if i % 2 == 0: a.remove(i) print ...

  8. python列表删除重复元素的三种方法

    给定一个列表,要求删除列表中重复元素. listA = ['python','语','言','是','一','门','动','态','语','言'] 方法1,对列表调用排序,从末尾依次比较相邻两个元素 ...

  9. Python循环列表删除元素问题

    有人会遇到这种问题,遍历列表,想删除列表中的某几个元素,执行后发现有些并没有删除到, 比如以下代码 a=[1,2,3,4,5,6]print(a) for i in a: if i==3 or i== ...

随机推荐

  1. linux的find命令详解

    find命令是用来在给定的目录下查找符合给定条件的文件 find [OPTIONS] [查找起始路径] [查找条件] [处理动作]   一.OPTIONS参数 -P.-L.-H:控制软连接的对待方式, ...

  2. ElasticSearch6.0 Java API 使用 排序,分组 ,创建索引,添加索引数据,打分等(一)

    ElasticSearch6.0  Java API  使用     排序,分组 ,创建索引,添加索引数据,打分等 如果此文章对你有帮助,请关注一下哦 1.1 搭建maven 工程  创建web工程 ...

  3. C++ Primer 第四版中文版

    C++Primer是C++的经典教程. 开始时间:2014-08-10 完成时间:2014-08-28 学习成果:基础语法+

  4. asp.net identity的学习记录

    # identity数据库 ## 创建空数据库 交给ef管理 ### 添加asp.net identity包 ``` Install-Package Microsoft.AspNet.Identity ...

  5. 前端之JavaScript 03

    window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个window对象.功能上讲: 控制浏览器窗口的.使用上讲: window对象不需要创建对象,直接使用即可. W ...

  6. 函数及参数http://www.cnblogs.com/Eva-J/p/7125925.html

    文件的修改操作.删除操作,with语句 函数: 函数的定义:def 函数名(形参1,形参2....): 函数的调用:函数名(实参1,实参2) 函数的返回值: 定义阶段:return 三种情况:没有返回 ...

  7. bzoj 1220 跳蚤

    Written with StackEdit. Description \(Z\)城市居住着很多只跳蚤.在\(Z\)城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以 ...

  8. ActionContext介绍(在Struts2中)

    一种属性的有序序列,它们为驻留在环境内的对象定义环境.在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等.多个对象可以存留在一个上下文内.也有根据上下文理解 ...

  9. c++ 遍历任务栏窗口

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h& ...

  10. 3 循环语句——《Swift3.0从入门到出家》

    3 循环语句 当一段代码被多次重复利用的使用我们就使用循环 swift提供了三种形式的循环语句 1.while 循环 2.repeat — while 循环 3.for — in 循环 while 循 ...