在Python中迭代一个列表并移除其中的某个元素时,结果可能会非常奇怪。

100
我有这段代码:
numbers = list(range(1, 50))

for i in numbers:
    if i < 20:
        numbers.remove(i)

print(numbers)

但是,我得到的结果是:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

当然,我期望结果中不会出现小于20的数字。看起来我在remove操作方面做错了什么。


另请参阅:https://dev59.com/p3M_5IYBdhLWcg3w1G6N。我重新考虑并决定这不是重复的问题;这个问题是关于理解一种错误方法失败的原因,而另一个问题则涉及寻找正确方法。 - Karl Knechtel
12个回答

0
嗯,我需要这样的东西。
答案是使用while语句。
它在我的情况下真的帮了我很多。所以我想把它作为一个答案发布出来。
numbers = list(range(1, 50))
while numbers:
    current_number = numbers[0]
    if current_number < 20:
        numbers.remove(current_number)
    else:
        break
numbers
>>> [20, 21, 22, 23, 24, 25, ..., 49]

我也想要加上我的特殊情况,使用whilefor以及[:],但这可能超出了范围,所以我会保留它。

0
有点晚了,但我觉得还是要加上我的答案。我找到了一个相当简单的技巧。
for x in list[::-1]:
    if validate(x):
        list.pop(x)

这样,你从末尾开始迭代。当你移除第n个元素时,元素n+1、n+2...的索引会减一,但因为你是倒着进行的,所以这不会影响到后面(或前面,在这种情况下)的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接