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为啥不能用列表遍历来删除列表中的相同的元素呢?的主要内容,如果未能解决你的问题,请参考以下文章

Python中的列表,元祖,集合,字典

为啥我的 Python 代码为列表中的所有元素提取相同的数据?

Python 为啥list不能作为字典的key

C语言 删除所有相同值的元素

python中删除列表中的重复内容

python代码:删除列表中相同的元素