Python为啥不能用列表遍历来删除列表中的相同的元素呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python为啥不能用列表遍历来删除列表中的相同的元素呢?相关的知识,希望对你有一定的参考价值。
我知道要用while循环,但是不明白为什么用遍历写出来会不对。比如:
a = [1,3,3,4,3,1,3,6,3,3,3,3,3,3,3,3,3,3]
for i in a:
if 3 in a:
a.remove(3)
print(a)
打出来的结果就是[1,4,1,6,3,3,3,3,3]
而且列表长度不同打出来的也不一样。是我写错了吗?
由于工作的需要,小编需要将旧表的数据迁移至新表,由于项目的需求要动态的创建表并迁移数据(表格用项目编号来区分,在模型类里面封装了创建表格的静态方法), 这个静态方法其实就是拼接sql语句。由于表格达到2000+,所以只好上线之前就迁移好数据和表格,小编花了将近一周的时间终于初见成效,但是其中有一块耗费了小编一天的时间,那就是在数据迁移的时候,遇到了不同的旧表的重复数据的迁移。我需要去掉重复的数据,所以也就有了双层的列表的遍历,删除相同数据的CNM天坑!也就是漏掉了数据,写这个经历不是为了什么,只是把自己的经验记下来,都是自己的宝贵财富。下面给大家介绍这个天坑:
look the demo:
lists = [1,2,3,4,5,6]
for list in lists:
lists.remove(list)
print(lists)
返回:[2, 4, 6]
解析:
1-问题:循环lists,想删除lists的所有元素,但实际确有数据保留了下来,
2-原因:这是因为在循环lists,并删除lists的元素时,列表的位置发生了移位,当删除“1”后,第二个元素“2”补位,这样“2”就躲过了被删除的命运,轮到“3”了,“3”被删除之后,“4”来补位,逃过一劫,以此类推!!
3-拓展:
(1)for循环是先判断对象是否为可迭代对象,不是的话直接报错,抛出TypeError异常,是的话,调用 __iter__或iter方法,返回一个迭代器
(2)不断地调用迭代器的__next__或next方法,每次按序返回迭代器中的一个值
(3)迭代到最后,没有更多元素了,就抛出异常 StopIteration,这个异常 python 自己会处理,不会暴露给开发者
4-所以在循环list时,不能循环的同时删除自身元素,而是要利用pop(下标)的删除。 参考技术A 数组是有索引下角标的,你每删一个3,数组就往前填充一位,比如
[1,3,3],你把第一个3(索引为1)删掉,那么第二个3就替代第一个3的位置了,可是你第一个3所代表的索引已经遍历过去了,就会漏一个3本回答被提问者采纳 参考技术B 直接用集合吧:
a = [1,3,3,4,3,1,3,6,3,3,3,3,3,3,3,3,3,3]
b = set(a)
c = list(b)
print(c)
望采纳。
python基础笔记-4python删除两个列表中相同的元素
删除两个列表中相同的元素
Tips:
1、被遍历的列表不可以直接做删除元素操作,不然列表本身长度变化会影响循环体执行结果。
2、列表本身可能存在相同元素,考虑引入一个新的空列表存储相同元素,再执行一次循环来删除1、中的被遍历的列表。
def del_same_element(list1: list, list2: list): same = [] for i in list1: if i in list2: same.append(i) list2.remove(i) for j in same: list1.remove(j) return list1, list2 if __name__ == \'__main__\': list1 = [4, 1, 2, 3, 4, 4, 9] list2 = [2, 3, 4, 6, 7, 8, 9, 4] a, b = del_same_element(list1, list2) print(a) print(b)
以上是关于Python为啥不能用列表遍历来删除列表中的相同的元素呢?的主要内容,如果未能解决你的问题,请参考以下文章