为什么 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)
:
之外,它是相同的两倍
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('\n \n')
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')
我得到的结果是:
3600
ok
2700
skipped 2700
900
ok
3600
ok
2700
skipped 2700
1800
ok
900
ok
正如您在第一个循环的结果中看到的那样,没有打印 1800,只是没有任何反应。
最终对我有用的是创建一个我想删除的项目列表。然后创建一个循环遍历我要删除的项目的新循环。然后这个新循环将从 final_dt_list.
中删除每个元素
在此处查看解决方案代码:
for r in removed:
final_dt_list.remove(r)
为什么现在可以,而不是上面的例子?我很困惑。
提前致谢!
dt_list
和 final_dt_list
指向同一个对象(别名)。
您在编辑列表的同时对其进行循环。由于您只保留用于循环的指针,因此您会记住位置,但随着元素消失,它们会发生变化。
尝试通过以下方式记住要删除的元素:
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]
编辑:
从一开始就使用列表解析会导致:
dt_list = [3600, 2700, 1800, 900]
dt_list = [x for x in dt_list if (3600/x).is_integer()]
我正在遍历一个列表,有时我会从另一个列表中删除一个元素。 for 循环跳过整个实际迭代,而不是从另一个列表中删除元素。我找到了解决办法,但我不太明白。
这是一个代码示例。除了我注释掉行 final_dt_list.remove(dt)
:
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('\n \n')
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')
我得到的结果是:
3600
ok
2700
skipped 2700
900
ok
3600
ok
2700
skipped 2700
1800
ok
900
ok
正如您在第一个循环的结果中看到的那样,没有打印 1800,只是没有任何反应。
最终对我有用的是创建一个我想删除的项目列表。然后创建一个循环遍历我要删除的项目的新循环。然后这个新循环将从 final_dt_list.
中删除每个元素在此处查看解决方案代码:
for r in removed:
final_dt_list.remove(r)
为什么现在可以,而不是上面的例子?我很困惑。
提前致谢!
dt_list
和 final_dt_list
指向同一个对象(别名)。
您在编辑列表的同时对其进行循环。由于您只保留用于循环的指针,因此您会记住位置,但随着元素消失,它们会发生变化。
尝试通过以下方式记住要删除的元素:
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]
编辑:
从一开始就使用列表解析会导致:
dt_list = [3600, 2700, 1800, 900]
dt_list = [x for x in dt_list if (3600/x).is_integer()]