python:在第二次迭代中跳过for循环的乘法

时间:2018-02-21 09:30:41

标签: python python-3.x for-loop multiplication sieve

我正在尝试实现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,喜欢在家里做这些事情以便更好地编码)

1 个答案:

答案 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)