作者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