Why does Python for-loop skip elements when iterating over a copy of a list and making deletions?
本问题已经有最佳答案,请猛点这里访问。
我正在迭代一个列表,有时我会从另一个列表中删除一个元素。for循环跳过整个实际迭代,而不是从另一个列表中删除元素。我找到了解决办法,但我不太明白。
下面是一个代码示例。这两倍是相同的,只是我把行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | dt_list = [3600, 2700, 1800, 900] final_dt_list = dt_list for dt in dt_list: print(dt) if not((3600/dt).is_integer()): print('skipped '+str(dt)) final_dt_list.remove(dt) continue print('ok') print(' ') dt_list = [3600, 2700, 1800, 900] final_dt_list = dt_list for dt in dt_list: print(dt) if not((3600/dt).is_integer()): print('skipped '+str(dt)) #final_dt_list.remove(dt) continue print('ok') |
我得到的结果是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 3600 ok 2700 skipped 2700 900 ok 3600 ok 2700 skipped 2700 1800 ok 900 ok |
正如您在第一个循环的结果中看到的,1800没有被打印出来,只是什么都没有发生。
最终对我起作用的是创建一个要删除的项目列表。然后创建一个循环,循环遍历我要删除的项。然后这个新的循环将从最终的元素列表中删除每个元素。
请参见此处的解决方案代码:
1 2 | for r in removed: final_dt_list.remove(r) |
为什么现在有效而不是上面的例子?我搞糊涂了。
事先谢谢!
同一物体的点你在上面编辑名单。自从你只保留指针看你回忆起的位置,但自从瓦尼斯元素消失后,它们却改变了。
试着回忆起你想要删除的元素
1 2 3 4 5 6 7 8 9 10 | dt_list = [3600, 2700, 1800, 900] rm_list = [] for dt in dt_list: print(dt) if not((3600/dt).is_integer()): print('skipped '+str(dt)) rm_list.append(dt) continue print('ok') dt_list = [x for x in dt_list if x not in rm_list] |
编辑:
Using list comprehensions from the start leads to:
ZZU1