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

发布于 2021-02-02 23:24:16

我有这段代码:

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

关注者
0
被浏览
121
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    在遍历列表时,你正在修改它。这意味着第一次遍历循环时,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]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看