作者kusoayan (瑋哥)
看板Python
標題[問題] list的remove
時間Thu Oct 20 10:45:52 2011
大家好,我在寫計算 m~n 中有多少質數的程式
附上程式碼:
import math
def generatePrime(m,n):
allNumber = range(m,n+1)
primeTable = (2,3,5,7,11,13,17,19,23,29)
index = 0
while index<len(allNumber):
tempSqrt = math.sqrt(allNumber[index])
for eachPrime in primeTable:
if tempSqrt < eachPrime:
break
if (allNumber[index] != eachPrime) and (allNumber[index] %
eachPrime == 0):
allNumber.remove(allNumber[index])
break
index = index + 1
return allNumber
我是想先利用一個質數表來檢驗,如果這個數不再質數表上,但是對質數取餘數後為零
則代表他不是質數,那就把他從 allNumber 中剔除
但是我這樣寫,只能把 2 的倍數剔出耶…
檢查了幾次應該沒有問題才對阿QQ
所以想上來請教各位高手,是哪裡出錯了呢
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.4.201
1F:推 Yshuan:我猜猜可能點 remove完當下 index指向下個(因為本來被刪除) 10/20 10:57
2F:→ Yshuan:然後你又做index = index + 1 所以你allNumber有些被跳過了 10/20 10:58
3F:→ kusoayan:我原本用 for 寫迴圈,可是 google 到好像會跳過一些值 10/20 11:23
4F:→ kusoayan:所以才改用 while .. QQ 10/20 11:23
的確被猜中了,我把
allNumber.remove(allNumber[index])
改成
allNumber[index] = 0
後
除了質數其他都變 0 了 ..
這樣我到底該怎麼剔除這些元素呢QQ
※ 編輯: kusoayan 來自: 140.112.4.201 (10/20 11:29)
5F:推 rexkimta:用另外一個list來存質數,allnumber就存allnumber就好了 10/20 11:41
6F:推 Yshuan:allNumber = [n for n in allNumber if isPrime(n)] 10/20 11:42
7F:→ Yshuan:isPrime(n) 回傳boolean來判斷 10/20 11:43
8F:推 kilfu0701:f_allNumber = filter(lambda a: a != 0, allNumber) 10/20 11:47
9F:→ kdjf:把東西從list拿掉會動到後面的每一個東西,不太好吧 10/20 20:10
10F:→ kusoayan:目前是採用Ys大的 filter 方法 QQ 10/20 22:02
11F:→ kusoayan:暫時運作正常 不過這樣對效能影響大嗎? 10/20 22:02