2013-02-20 134 views
0

所以我一直在遇到一個非常奇怪的錯誤。我有一個包含列表索引超出範圍內循環索引2

import math 

def go(): 
    list_ = list(range(3, 100000, 2)) 
    max_ = int(math.sqrt(len(list_))) 
    print(len(list_)) 
    print(max_) 
    for i in range(1,max_): 
     print(i) 
     current = list_[i] 
     for j in list_[i+1:]: 
      if j % i == 0: 
       list_.remove(j) 
go() 

模塊ten.py輸出是這樣的:

49999 
223 
1 
2 
Traceback (most recent call last): 
    File "D:\Documents\KomodoProjects\Project Euler\ten.py", line 14, in <module> 
    go() 
    File "D:\Documents\KomodoProjects\Project Euler\ten.py", line 10, in go 
    current = list_[i] 
IndexError: list index out of range 

正如你可以看到列表的大小是49999和for循環只到223儘管所有這一點,已經在索引= 2時給出了一個超出範圍的異常索引!

for循環中的list_不知道是不是引用list_裏面的go()?我不知道爲什麼會出現這個問題。

固定在list_改變

for i in range(1,max_): 

到 爲我:

+0

回溯提到了一個變量'current',但是這個變量沒有出現在你給定的代碼中。也許你應該發佈你正在運行的實際代碼。 – steveha 2013-02-20 20:19:05

+0

對不起,我刪除了該行,但沒有更新回溯。現在編輯。 – 2013-02-20 20:19:47

+0

此外 - 對於一般歐拉 - 你可能會發現這篇文章的興趣http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python – 2013-02-20 20:19:47

回答

0

這裏是你的問題:

你有for循環,從list_刪除號碼。正在刪除如此多的數字,list_爲長度2,然後list_[2]失敗並引發異常。

它刪除這麼多數字的原因是,你計算x % 1 == 0這是任何值的x是真實的。由於您從列表中的位置2開始,因此您將刪除該位置後的所有內容。

我不確定你在做什麼,但是這將是一個很慢的方法來做到這一點,不管它是什麼。這看起來有點像篩選素數......你可能想要Google搜索「Python找到素數」或其他東西。

+1

特別是,在'i = 1'處,任何j值的值都會返回真'j%i == 0'(1均分爲所有內容)。 – Hannele 2013-02-20 20:27:53

+0

哦,哇,外面的for循環從1開始。它應該不是一個範圍(),而只是list_。當我測試不同的東西的時候,這肯定已經搞亂了。 – 2013-02-20 20:29:22