Python For循环未遍历全部元素?列表元素删除异常求助
为啥遍历列表删除元素会漏删?
这绝对是Python新手最容易踩的坑之一!我来给你拆解一下问题出在哪:
当你用for item in a遍历列表的时候,Python是按索引顺序来取元素的。咱们一步步走一遍你的代码:
初始列表a = ['bob','bob','bob','bob','bob','bob','bob'](索引0到6),b = ['bob']。
- 第一次循环:取索引0的元素
'bob',它在b里,所以执行a.remove(item)。这时候列表a变成了6个元素:['bob','bob','bob','bob','bob','bob'](原来的索引1-6现在变成了0-5)。 - 第二次循环:Python会取下一个索引,也就是1。但现在列表的索引1对应的是原来的索引2的
'bob'——原来的索引1的元素现在跑到索引0的位置,被跳过了! - 就这样,每删除一个元素,后面的元素都会往前挪一位,遍历的索引却在递增,导致每两个元素就会跳过一个。7个元素最后就剩下3个没被处理到的
'bob'。
解决方法有这几种,选你顺手的:
方法1:遍历列表的副本
遍历原列表的切片副本(a[:]会创建一个和原列表一样的新列表),这样修改原列表的时候不会影响遍历的顺序:
a = ['bob','bob','bob','bob','bob','bob','bob'] b = ['bob'] for item in a[:]: # 这里用a[:]遍历副本 if item in b: a.remove(item) print(a) # 输出:[]
方法2:用列表推导式生成新列表
这是Pythonic的做法,直接生成一个不包含目标元素的新列表,简单高效:
a = ['bob','bob','bob','bob','bob','bob','bob'] b = ['bob'] a = [item for item in a if item not in b] print(a) # 输出:[]
方法3:反向遍历列表
从列表末尾开始遍历,删除元素不会影响前面未遍历的元素的索引:
a = ['bob','bob','bob','bob','bob','bob','bob'] b = ['bob'] for item in reversed(a): if item in b: a.remove(item) print(a) # 输出:[]
内容的提问来源于stack exchange,提问作者immeeh
相关产品推荐
相关产品推荐

