关于模数:使用Python模运算符对列表进行排序

Using Python Modulo Operator to Sort List

我一直在研究项目Euler问题,尝试学习python,并编写了第二个问题的解决方案(在fibonacci序列中找到不超过400万个偶数值项的和)。代码给出了正确的解决方案,但它要求我使用模除两次,以便从生成的斐波那契数列表中删除奇数值。以下是我写的解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
term_1 = 1
term_2 = 2
fibonacci_list = [1]
while term_2 < 4000000:
    fibonacci_list.append(term_2)
    term_1, term_2 = term_2, term_1 + term_2
for num in fibonacci_list:
    if num % 2 != 0
        fibonacci_list.remove(num)
for num in fibonacci_list:
    if num % 2 != 0
        fibonacci_list.remove(num)
return sum(fibonacci_list)

如果我只放入一个for循环,那么列表fibonacci_列表将变成以下列表:

1
[2, 5, 8, 21, 34, 89, 144, 377, 610, 1597, 2584, 6765, 10946, 28657, 46368, 121393, 196418, 514229, 832040, 2178309, 3524578]

难道所有奇数项都不能通过模除检验而被删除吗?为什么我需要运行两次for循环来删除所有奇数项?


我认为您所面临的问题是,您试图在遍历列表时从列表中删除项。

有关同一主题的先前问题,请参阅此处、此处和此处。

为了便于讨论,让我们假设这实际上是问题所在,让我们假设在遍历列表时禁止从列表中删除项。

您可以做些什么不同的事情来避免在迭代列表时从列表中删除项目?我不确定你是否想直接得到答案,因为你正在做项目欧拉,所以我不会给出任何明显的答案。


只是简单地看了一下,但看起来您正在改变正在迭代的集合,即,当您删除项时,指向当前项/下一项的指针将受到影响,并且在第一次传递时可能跳过某些项。


这让我想起了埃拉托斯特尼的筛子。因此,我想提出这个解决方案,假设将您的列表转换为一个array

1
fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0  ]

将您的计划与此进行比较。可能会有帮助。

1
2
3
4
5
6
7
8
9
10
11
12
fibonacci = [1,2]
num = 3
while num < 4000000:
    fibonacci.append(num)
    len_ = len(fibonacci)
    num = fibonacci[len_-2] + fibonacci[len_-1]

sum = 0
for num in fibonacci:
    if num%2 == 0: sum += num

print sum

我不明白为什么你不需要从列表中删除奇数条目。加上偶数就行了。


不难看出,斐波那契数列的每三项都是偶数。你可以用它来代替。

在任何情况下,您都会陷入一个经典的陷阱,即在对序列进行迭代时对其进行变异。不要这样做,这样做:

1
fibonacci_list[:] = [x for x in fibonacci_list if x%2==0]