list.delete()在python中影响for循环

时间:2018-01-21 09:30:20

标签: python list for-loop

我刚刚在我的程序中发现了list.delete()的一个非常奇怪的行为。我目前正在做Project Euler的第二个问题,你必须得到所有偶数斐波纳契数的总和,直到400万。我在列表中创建了所有这些,然后想要遍历它们以找出所有不均数并删除它们。这是我的代码:

print(fibonacci)

for zahl in fibonacci:
    print(zahl, end=' ')
    if zahl%2 != 0:
        print('not even')
        fibonacci.remove(zahl)
    else:
        print('even')

给出了:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578]
1 not even
2 even
3 not even
8 even
13 not even
34 even
55 not even
144 even
233 not even
610 even
987 not even
2584 even
4181 not even
10946 even
17711 not even
46368 even
75025 not even
196418 even
317811 not even
832040 even
1346269 not even
3524578 even
7465174

奇怪的是有些数字丢失了!

例如,

5和377(还有一些)。现在来了。如果我将fibonacci.delete(zahl)行注释掉,那么就会在那里打印出来,正确地宣布为不均匀。

这种行为来自何处。它可能来自我影响我正在迭代的列表吗?

我不确定,但我真的很想知道。我搜索了这个现象,但没有发现任何可以解决我的问题或解释它来自哪里。

我想知道两件事

  • 来自我的行为会影响我正在迭代的列表吗?

  • 我该如何纠正?

1 个答案:

答案 0 :(得分:2)

这是因为您从正在迭代的列表中删除元素。如果您注释掉.remove部分,您会看到所有数字都已打印出来。如果底层迭代函数(__iter____next__)通过索引访问列表并且您要删除列表中的元素,则索引会更改。

非常适合您的问题的功能是filter。此函数过滤与条件匹配的列表中的值。在你的情况下,你会想要所有偶数。你可以这样做:

print(list(filter(lambda x: x % 2 == 0, fibonacci)))