gpt4 book ai didi

python - 如果我在迭代列表时从列表中删除,为什么会跳过元素?

转载 作者:行者123 更新时间:2023-11-28 17:37:53 28 4
gpt4 key购买 nike

我试过这个:

list = [[1], [2], [], [4], [5], [], [], [], [9]]
for e in list:
if e == []:
list.remove(e)

然后我得到了

>>> list
[[1], [2], [4], [5], [], [9]]

发生了什么?!

最佳答案

for e in list:
if e == []:
list.remove(e)

在这种情况下,当 e 是一个空列表时,该特定值将从列表中删除。因此,列表中的下一个元素成为当前元素。在下一次迭代中,从列表中取出下一个元素。由于实际的下一个元素已向后移动,因此将采用实际下一个元素的下一个。因此,如果有多个连续匹配项,则有可能跳过元素。

在您的情况下,假设 e 位于 [2] 之后的 []

[[1], [2], [], [4], [5], [], [], [], [9]]
^

因为是空列表,所以会被移除,列表变成

[[1], [2], [4], [5], [], [], [], [9]]
^

在下一次迭代中,将选择下一个元素,所以

[[1], [2], [4], [5], [], [], [], [9]]
^

在这种情况下,我们默默地跳过了[4]。但是,由于它在输出中是预期的,所以它没有任何区别。但是考虑 [5] 之后的 []

[[1], [2], [4], [5], [], [], [], [9]]
^

那将被删除,所以列表变成这样

[[1], [2], [4], [5], [], [], [9]]
^

现在,在下一次迭代中,e 将引用下一个元素,即

[[1], [2], [4], [5], [], [], [9]]
^

因此,当前的空列表被删除,[9] 成为当前元素。这就是跳过其中一个空列表的方式。

注意:底线是,永远不要在迭代时从容器中移除项目。

解决方案一:

最常见的技术是使用正在迭代的列表的副本,因为迭代和实际列表将在循环中被修改。例如,

for e in list[:]:       # `list[:]` is a shallow copy of `list`
if e == []:
list.remove(e)

解决方案 2:(首选方法)

使用列表理解,使用过滤条件来创建一个新列表,像这样

>>> [e for e in list if e]
[[1], [2], [4], [5], [9]]

注意消除空列表的方式。 Python 中的空列表被视为 Falsy 值。因此,只有当 e 中至少有一个元素时,if e 才会评估为 Truthy。

关于python - 如果我在迭代列表时从列表中删除,为什么会跳过元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28642646/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com