You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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是连续的:

  1. 循环第一次拿到元素50,检查到含5,执行删除操作,此时列表里的51会往前移动到原来50的位置。
  2. 循环的下一次迭代会取下一个索引位置的元素——原本这个位置是51,现在变成了52,所以51直接被跳过,根本没被检查到。
  3. 同理,53、55这些元素都是因为前一个含5的元素被删除后,自己前移,刚好跳过了循环的检查,所以留在了列表里。

为什么filter函数没问题?

filter函数是基于原列表生成一个独立的迭代器,它不会修改原列表的结构,会逐个检查原列表里的每一个元素,把符合过滤条件的元素筛选出来生成新的结果,自然不会出现漏检的情况。

正确的解决方式

有两种常用的靠谱写法:

  1. 遍历原列表的副本,这样修改原列表不会影响遍历过程:
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)
  1. 用列表推导式直接生成目标列表(最推荐,代码简洁高效):
the_list = [i for i in range(101) if "5" not in str(i)]
print(the_list)

内容的提问来源于stack exchange,提问作者Said

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:16:13