有没有人知道如何使用列表理解来编写最多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)
答案 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倍。你不应该使用它。