一尘不染

Python-从列表中删除项目时出现奇怪的结果

python

我有这段代码:

numbers = 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的数字不会出现在结果中,我假设我对删除操作做错了什么。


阅读 428

收藏
2020-02-06

共1个答案

一尘不染

在遍历列表时,你正在修改它。这意味着第一次遍历循环时,i==1,因此1从列表中删除。然后for循环转到列表中的第二项,不是2,而是3!然后从列表中删除,然后for循环转到列表中的第三项,现在是5。等等。也许这样更容易想象,用^表示i的值:

[1, 2, 3, 4, 5, 6...]
 ^

最初是列表的状态;然后删除1,然后循环转到列表中的第二项:

[2, 3, 4, 5, 6...]
    ^
[2, 4, 5, 6...]
       ^

等等。

在迭代列表时,没有很好的方法来更改列表的长度。你可以做的最好的事情是这样的:

numbers = [n for n in numbers if n >= 20]

或这样,就地更改(parens中的内容是一个生成器表达式,在切片分配之前隐式转换为元组):

numbers[:] = (n for in in numbers if n >= 20)

如果要在删除n之前对n执行操作,可以尝试的一种技巧是:

for i, n in enumerate(numbers):
    if n < 20 :
        print "do something" 
        numbers[i] = None
numbers = [n for n in numbers if n is not None]
2020-02-06