为何使用for循环删除列表中含5的元素会出现遗漏?
遍历列表时删除元素为何会漏删?
先看你的代码和输出:
the_list = [i for i in range(101)] for i in the_list: if "5" in str(i): the_list.remove(i) print(the_list)
输出结果里残留了[51, 53, 55, 57, 59],原因很简单:你在遍历列表的同时直接修改了它的结构,导致遍历的索引错位。
具体过程拆解
举个局部例子,原列表中50、51、52是连续的:
- 循环第一次拿到元素50,检查到含5,执行删除操作,此时列表里的51会往前移动到原来50的位置。
- 循环的下一次迭代会取下一个索引位置的元素——原本这个位置是51,现在变成了52,所以51直接被跳过,根本没被检查到。
- 同理,53、55这些元素都是因为前一个含5的元素被删除后,自己前移,刚好跳过了循环的检查,所以留在了列表里。
为什么filter函数没问题?
filter函数是基于原列表生成一个独立的迭代器,它不会修改原列表的结构,会逐个检查原列表里的每一个元素,把符合过滤条件的元素筛选出来生成新的结果,自然不会出现漏检的情况。
正确的解决方式
有两种常用的靠谱写法:
- 遍历原列表的副本,这样修改原列表不会影响遍历过程:
the_list = [i for i in range(101)] for i in the_list.copy(): if "5" in str(i): the_list.remove(i) print(the_list)
- 用列表推导式直接生成目标列表(最推荐,代码简洁高效):
the_list = [i for i in range(101) if "5" not in str(i)] print(the_list)
内容的提问来源于stack exchange,提问作者Said
相关产品推荐
相关产品推荐

