您的位置:首页 > 编程语言 > Python开发

python中用for循环遍历的过程中删除列表中元素的注意点

2018-09-07 19:41 489 查看

小编今天从项目引入这个天大的坑!!!

由于工作的需要,小编需要将旧表的数据迁移至新表,由于项目的需求要动态的创建表并迁移数据(表格用项目编号来区分,在模型类里面封装了创建表格的静态方法), 这个静态方法其实就是拼接sql语句。由于表格达到2000+,所以只好上线之前就迁移好数据和表格,小编花了将近一周的时间终于初见成效,但是其中有一块耗费了小编一天的时间,那就是在数据迁移的时候,遇到了不同的旧表的重复数据的迁移。我需要去掉重复的数据,所以也就有了双层的列表的遍历,删除相同数据的CNM天坑!也就是漏掉了数据,写这个经历不是为了什么,只是把自己的经验记下来,都是自己的宝贵财富。下面给大家介绍这个天坑:

look the demo:

[code]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(下标)的删除。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: