[問題] list的remove

看板Python作者 (瑋哥)時間14年前 (2011/10/20 10:45), 編輯推噓4(407)
留言11則, 5人參與, 最新討論串1/1
大家好,我在寫計算 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

10/20 10:57, , 1F
我猜猜可能點 remove完當下 index指向下個(因為本來被刪除)
10/20 10:57, 1F

10/20 10:58, , 2F
然後你又做index = index + 1 所以你allNumber有些被跳過了
10/20 10:58, 2F

10/20 11:23, , 3F
我原本用 for 寫迴圈,可是 google 到好像會跳過一些值
10/20 11:23, 3F

10/20 11:23, , 4F
所以才改用 while .. QQ
10/20 11:23, 4F
的確被猜中了,我把 allNumber.remove(allNumber[index]) 改成 allNumber[index] = 0 後 除了質數其他都變 0 了 .. 這樣我到底該怎麼剔除這些元素呢QQ ※ 編輯: kusoayan 來自: 140.112.4.201 (10/20 11:29)

10/20 11:41, , 5F
用另外一個list來存質數,allnumber就存allnumber就好了
10/20 11:41, 5F

10/20 11:42, , 6F
allNumber = [n for n in allNumber if isPrime(n)]
10/20 11:42, 6F

10/20 11:43, , 7F
isPrime(n) 回傳boolean來判斷
10/20 11:43, 7F

10/20 11:47, , 8F
f_allNumber = filter(lambda a: a != 0, allNumber)
10/20 11:47, 8F

10/20 20:10, , 9F
把東西從list拿掉會動到後面的每一個東西,不太好吧
10/20 20:10, 9F

10/20 22:02, , 10F
目前是採用Ys大的 filter 方法 QQ
10/20 22:02, 10F

10/20 22:02, , 11F
暫時運作正常 不過這樣對效能影響大嗎?
10/20 22:02, 11F
文章代碼(AID): #1Eduja3_ (Python)
文章代碼(AID): #1Eduja3_ (Python)