使用Python模运算符对列表进行排序

时间:2011-06-30 20:38:03

标签: python modulus

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

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_list将变为以下内容:

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

不是所有奇数项都不能通过模数除法测试而被删除吗?为什么我需要运行for循环两次以删除所有奇数编号的术语?

5 个答案:

答案 0 :(得分:3)

我想你遇到的问题是你在迭代列表时试图从列表中删除项目。

有关同一主题的先前问题,请参阅hereherehere

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

你可以做些什么,这会导致你在迭代时不需要从列表中删除项目?我不确定你是否想要直接给出答案,因为你正在做Project Euler,所以我不会给出任何明显的答案。

答案 1 :(得分:1)

只是简单地看一下,但看起来你正在改变你正在迭代的集合,即当你删除项目时,指向当前项目/下一个项目的指针将受到影响,并且某些项目可能会被跳过通过。

答案 2 :(得分:0)

不难看出,只有斐波纳契序列的每第3个项都是偶数。你可以改用它。

在任何情况下,你都会在迭代它时陷入the classic trap变异序列。不要那样做,这样做:

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

答案 3 :(得分:0)

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

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

我不明白为什么你不必从列表中删除奇数编号的条目。只需添加偶数编号即可。

答案 4 :(得分:0)

这让我想起了Eratosthenes的筛子。所以我想提出这个解决方案,假设将您的列表转换为array

fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0  ]