簡體   English   中英

使用 Python 模運算符對列表進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM