[英]Using Python Modulo Operator to Sort List
我一直在研究 Project Euler 問題以嘗試學習 python 並且我寫了第二個問題的解決方案(找到斐波那契數列中不超過四百萬的偶數項的總和)。 該代碼為我提供了正確的解決方案,但它要求我使用兩次模除法,以便從我生成的斐波那契數列中刪除奇數值。 這是我寫的解決方案:
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 循環來刪除所有奇數項?
只是簡單地看了這個,但看起來你正在改變你正在迭代的集合,即當你刪除項目時,指向當前項目/下一個項目的指針將受到影響,並且某些項目可能會在第一次通過時被跳過。
這讓我想起了埃拉托色尼的篩子。 所以我想提出這個解決方案,假設將您的列表轉換為array
:
fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0 ]
不難看出,只有斐波那契數列的第三項是偶數。 你可以改用它。
在任何情況下,您都陷入了在迭代序列時改變序列的經典陷阱。 不要那樣做,這樣做:
fibonacci_list[:] = [x for x in fibonacci_list if x%2==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
我不明白你為什么沒有必要從列表中刪除奇數條目。 只需添加偶數的就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.