有没有人知道如何使用列表理解来编写最多n个素数列表?

时间:2014-12-07 12:32:10

标签: python

有没有人知道如何使用列表理解来编写最多n个素数列表? 到目前为止我有这个代码是有效的,但我想要一个有效但在列表理解中的代码!谢谢你的帮助!

我的代码:

primes = [2]
for i in range(3, n + 1, 2): 
    isprime = True 
    for j in primes:
        if i % j == 0:  
            isprime = False  
            break  
    if isprime: 
        primes.append(i)

2 个答案:

答案 0 :(得分:0)

我不相信有任何方法可以使用先前生成的列表内容,而在列表理解期间仍在构建列表。对该列表对象的第一个可用引用仅在构造结束时显示为表达式结果。

您可以使用类似的想法,即生成器表达式来删除内部循环:

if all(i%j != 0 for j in primes):
    primes.append(i)

这是有效的,因为所有人都接受一个iterable,并在第一个错误结果处停止,就像你的for循环一样。

我没有及时考虑这是否更快。它不能“在算法上”更快,因为它以相同的顺序执行相同的操作。对于大型操作,一次应该大约是另一次的固定部分。

Sieve of Eratosthenes通常比试验除法(你的方法)快得多,用于生成从2到n的所有素数。

答案 1 :(得分:0)

我认为你不能用你的算法做,但是你可以检查数字n是否可以被n和n的平方根之间的数字整除(你只想检查素数):

primes = [i for i in range(2, n+1) if all(i%i2 for i2 in range(2, int(sqrt(i))))]

primes现在是2到100之间所有素数的列表。

这可能不如你的方法有效,但它使用列表理解,因此代码少得多。

编辑: 我只是想出了我的解决方案与timeit模块的效率,我的解决方案比你的解决方案慢10倍。你不应该使用它。