为什么Python for循环在遍历列表副本并进行删除时跳过元素?

Why does Python for-loop skip elements when iterating over a copy of a list and making deletions?

本问题已经有最佳答案,请猛点这里访问。

我正在迭代一个列表,有时我会从另一个列表中删除一个元素。for循环跳过整个实际迭代,而不是从另一个列表中删除元素。我找到了解决办法,但我不太明白。

下面是一个代码示例。这两倍是相同的,只是我把行final_dt_list.remove(dt)注释掉了:

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