我正在尝试实现Euler的筛选(如programmingpraxis.com所述)。我的代码在第一次迭代时运行良好,但是在下一次迭代中,由于某种原因我跳过了我的乘法(可能只是缺少一些python-behavior,这对于一个更有经验的程序员来说是常识) 我正在运行这个:
import numpy as np
#set up parameters
primes = [2]
startval = 2
stopval = 10000
firstrun = True
candidates = np.arange(start=startval,stop=stopval+1,step=1)
#actual program
for idx in range(int(np.ceil(np.sqrt(stopval)))): #only up until sqrt(n) needs checking
print('pos1')
print(candidates)
print(candidates[0])
times = candidates[0]*candidates
print(times)
diffset = list(set(candidates)^set(times))
if len(diffset) is not 0: #to make sure the program quits properly if diffset=[]
primes.append(diffset.pop(0))
print('pos2')
print(diffset)
candidates = diffset
print('pos3')
print(candidates)
else:
break
print(primes)
各种印刷声明只是让我能够掌握最新情况。注意第一个输出很好,有趣的部分在第二次打印时开始。我的候选人正如我所希望的那样更新,新的第一个元素也是正确的。所以我的问题是:
为什么times = candidates[0]*candidates
在第二次迭代时显然会被跳过?
请注意:我并不是要求你抓住你的代码,复制这个工作,更快,更好,更好的代码"回答。那里有很多python实现,我想自己做。我想我在这里错过了一个相当重要的python概念,这也就是为什么我的代码没有表现出来。
(如果有人问:不,这不是家庭作业。我在我的工作场所使用一些python,喜欢在家里做这些事情以便更好地编码)
答案 0 :(得分:0)
我刚刚运行了你的代码。查看第14行中times
的输出,您可以看到在第一次迭代后执行操作,但不是按照您的预期方式执行。列表times
只是列出candidates
列表的三倍。详细说明:
第一次迭代
candidates = np.arange(start=startval,stop=stopval+1,step=1)
因此候选人是一个numpy数组。做
candidates*candidates[0]
与candidates*2
相同,即" numpy_array * number",这只是元素乘法。
现在进一步向下做
diffset = list(set(candidates) ^ set(times))
....
candidates = diffset
设置:
第二次迭代
candidates
现在是列表(见上文)。做
candidates*candidates[0]
只是candidates*3
现在是" list * number"在python中不是"将每个列表元素乘以数字",而是:"创建新列表作为原始列表连接数字时间与其自身"。这就是您没有看到预期输出的原因。
要解决此问题,只需执行以下操作:
candidates = np.array(diffset)