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循环来删除所有奇数项?
我认为您所面临的问题是,您试图在遍历列表时从列表中删除项。
有关同一主题的先前问题,请参阅此处、此处和此处。
为了便于讨论,让我们假设这实际上是问题所在,让我们假设在遍历列表时禁止从列表中删除项。
您可以做些什么不同的事情来避免在迭代列表时从列表中删除项目?我不确定你是否想直接得到答案,因为你正在做项目欧拉,所以我不会给出任何明显的答案。
只是简单地看了一下,但看起来您正在改变正在迭代的集合,即,当您删除项时,指向当前项/下一项的指针将受到影响,并且在第一次传递时可能跳过某些项。
这让我想起了埃拉托斯特尼的筛子。因此,我想提出这个解决方案,假设将您的列表转换为一个
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] |