Python遍历列表删除符合条件元素仅生效一次的原因排查
Python遍历列表删除元素时漏删的原因及解决办法
你遇到的问题核心是在遍历列表的同时直接修改列表(删除元素)会打乱遍历的索引顺序,导致部分元素未被遍历到。
先看你的代码:
a_list = [[1, 1, 1], [3, 0, 0]] for i in a_list: if sum(i) != 3: continue else: a_list.remove(i) print(a_list)
为什么只删了第一个符合条件的元素?
原列表初始长度为2,遍历流程如下:
- 第一次循环取列表第0个元素
[1,1,1],sum等于3,执行remove(i)后,列表变为[[3,0,0]],长度变为1。 - 循环尝试取下一个元素(索引1),但此时列表长度仅为1,索引1不存在,循环直接终止,第二个元素
[3,0,0]根本没被遍历到,自然不会被删除。
正确的解决方法
方法1:遍历原列表的副本
遍历列表的拷贝,修改原列表不会影响遍历过程:
a_list = [[1, 1, 1], [3, 0, 0]] # 遍历原列表的副本 for i in a_list.copy(): if sum(i) == 3: a_list.remove(i) print(a_list) # 输出 []
方法2:使用列表推导式(推荐)
直接生成新列表,只保留不符合删除条件的元素,简洁高效:
a_list = [[1, 1, 1], [3, 0, 0]] # 保留元素和不等于3的子列表 a_list = [sub_list for sub_list in a_list if sum(sub_list) != 3] print(a_list) # 输出 []
方法3:倒序遍历
从列表末尾往前遍历,删除元素不会影响前面未遍历元素的索引:
a_list = [[1, 1, 1], [3, 0, 0]] # 从最后一个索引倒序遍历到0 for idx in range(len(a_list)-1, -1, -1): if sum(a_list[idx]) == 3: del a_list[idx] print(a_list) # 输出 []
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

