python中循环删除列表中元素时的坑![转]

原博文链接:https://www.cnblogs.com/baihualin/p/10698651.html

循环删除列表中元素时千万别用正序遍历,一定要用反序遍历!

废话不多说,先上案例代码:

def test(data):
    for i in data:
        data.remove(i)
    return data

data = [1, 2, 3]
print(test(data))

面对以上代码,乍一看以为会打印出空列表,因为test函数内通过for的方法将data中的元素都删除了,其实不然,实际输出如下:

[2]

为什么会产生这种结果呢? 我们来深度剖析一下:

原列表在内存中为:

第一次执行到data.remove(i)时将第一个元素‘1’删除,列表变为:

第二次执行到data.remove(i)时i为第二个元素,即‘3’,此时将‘3’删除,列表变为:

此时列表已经没有第三个元素了,即退出循环,将[2]返回。

如何解决这个问题呢? 我们可以用倒序删除的方法!

直接上代码:

def test(data):
    for i in data[::-1]:
        data.remove(i)
    return data

data = [1, 2, 3]
print(test(data))

此时再运行,发现输出结果为空列表

[]

倒序删除原理如下:

原列表在内存中为:

第一次执行到data.remove(i)时是将倒数第一个元素‘3’删除,列表变为:

第二次执行到data.remove(i)时i为倒数第二个元素,即‘2’,此时将‘2’删除,列表变为:

第三次执行到data.remove(i)时i为倒数第三个元素,即‘1’,此时将‘1’删除,列表变为空列表!

总结:正序删除列表中元素时,被删元素后面的值会向前顶,然后导致漏删。倒序删除元素时,被删元素前面的值不会向后靠,所以可以完整的遍历到列表中所有的元素。

原文地址:https://www.cnblogs.com/lilinyuan5474/p/11655582.html

时间: 2024-08-25 17:49:07

python中循环删除列表中元素时的坑![转]的相关文章

JAVA中循环删除list中元素的方法总结

印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末.看总结.. JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环).iterator遍历. 1.for循环遍历list for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")

AVA中循环删除list中元素

文章来源: https://www.cnblogs.com/pcheng/p/5336903.html JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环).iterator遍历. 1.for循环遍历list for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")) list.remove(i); } 这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索

JAVA中循环删除list中元素的方法总结(跳格删除问题解决)(转)

印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末.看总结.. JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环).iterator遍历. 1.for循环遍历list for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")

Python 学习2 删除列表中的重复数据

list0=['b','c', 'd','b','c','a','a'] 方法1:使用set() list1=sorted(set(list0),key=list0.index) # sorted output print( list1) 方法2:使用 {}.fromkeys().keys() list2={}.fromkeys(list0).keys() print(list2) 方法3:set()+sort() list3=list(set(list0)) list3.sort(key=li

Python3基础 list 使用for循环 删除列表中的重复项

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? code """ @Author : 行初心 @Date : 18-9-23 @Blog : www.cnblogs.com/xingchuxin @GitHub : github.com/GratefulHeartCoder """ de

循环删除list中的某一元素的四种方式

方式一: /** * 直接使用foreach方法移除list中的元素会抛异常 * Exception in thread "main" java.util.ConcurrentModificationException * 这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化, * 所以会导致你在遍历的时候漏掉某些元素. * 比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位, * 所以实际访问的是第3个元素.

python——删除列表中的元素

在python中,删除列表元素的方法有三种,分别为remove(),del(),pop()函数 (1)remove() >>> name = ['小明','小华','小红','小李','小霞','小文'] >>> name.remove('小红') >>> name ['小明', '小华', '小李', '小霞', '小文'] remove()函数里面的参数必须是列表中已有的元素值. (2)del() >>> name = ['小明'

Python 如何优雅的删除列表中的重复元素

假定有一个需求:需要删除列表中的重复元素,有几种实现方法? 方法一:利用Python 集合的特性 去除重复元素,代码如下: list1 = [1,3,5,7,9,7,4,3,6,1] #将列表强制转换为集合,再转换回列表形式 list1=list(set(list1)) print(list1) 方法二:用一个词形容,腾笼换鸟,代码如下: list1 = [1,3,5,7,9,7,4,3,6,1] list2=[] for i in list1: #遍历list1列表中的元素,如果该元素不在li

循环删除list中多个元素

错误的做法: for(int i= 0;i<list.size();i--){ for(int j= 0; j<list2.size();j++){ if(list.get(i).contains(list2.get(j))){ list.remove(i); } } } 结果:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 因为在你删除元素的同事list.size()在变小,这