Python遍历a_list移除元素1存入one_list输出不符合预期如何解决
异常原因
核心问题是遍历列表的同时修改列表长度,导致循环索引错位:
- Python的for循环遍历列表时是按索引顺序依次取值的,每次调用
remove()删除列表元素后,列表中位于被删元素后面的所有元素都会自动向前移动一位补位。 - 此时循环的计数索引仍会正常向后累加,就会跳过刚补位到被删位置的元素,最终出现漏匹配的情况。你的代码里就是每次删除1之后,下一个1挪到当前索引位置,被循环跳过,所以只匹配到了2个1。
解决方法
方案1:遍历原列表的副本,修改原列表
如果需要保留修改原列表的逻辑,可以遍历原列表的切片副本,遍历过程不受原列表长度变化的影响:
a_list = [1,1,1,1,3,4,5] one_list = [] # a_list[:] 是原列表的浅拷贝 for a in a_list[:]: if a == 1: one_list.append(a) a_list.remove(a) print(a_list) print(one_list)
方案2:用列表推导式直接生成结果(更高效)
不需要修改原列表,直接通过筛选生成两个目标列表,性能比遍历删除元素更高:
a_list = [1,1,1,1,3,4,5] one_list = [x for x in a_list if x == 1] a_list = [x for x in a_list if x != 1] print(a_list) print(one_list)
两种方案都可以得到你预期的输出:
[3, 4, 5] [1, 1, 1, 1]
内容的提问来源于stack exchange,提问作者Stack Vau
相关产品推荐
相关产品推荐

