使用列表理解查找素数

Finding prime numbers using list comprehention

我试图生成 x 到 y 范围内的所有素数。我首先尝试了一个简单的例子:range(10,11) 这意味着检查 10 是否是素数:
这是我的代码:

prime_list = [x for x in range(10, 11) for y in range(2,x) if x % x == 0 and x % 1 == 0 and x % y != 0]

我知道这个东西缺少告诉表达式 x%y != 0 应该检查 range (2,x) 和 return 中所有 y 的选项,当且仅当所有都满足时这种情况。

我们该怎么做?

使用all检查所有元素(从2到x-1)是否满足条件:

>>> [x for x in range(2, 20)
     if all(x % y != 0 for y in range(2, x))]
[2, 3, 5, 7, 11, 13, 17, 19]

带过滤器的版本:

filter(lambda x:all(x % y != 0 for y in range(2, x)), range(2, 13))

一种使用集合理解的方法可以是

list(set(range(2,11)) - {x for x in range(11) for y in range(2,x) if x%y == 0})

@falsetru 的回答是正确的。而且,应该注意优化代码。正如有人在 Kasra 的回答评论中所说

In [227]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, int(m.sqrt(x)) + 1))]
100 loops, best of 3: 2.08 ms per loop

In [228]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, int(m.sqrt(x)) + 1))]
100 loops, best of 3: 2.09 ms per loop

In [229]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, x-1))]
100 loops, best of 3: 10.4 ms per loop

In [230]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, x-1))]
100 loops, best of 3: 10.3 ms per loop

使用列表解析在给定范围内查找素数的程序:

min = 10

max = 100

primes = [num for num in range(min,max) if 0 not in [num%i for i in range(2,int(num/2)+1)]]

print (primes)

您可以使用平方根的概念进行更多优化,以免遍历整个列表并通过以下方式更快地计算素数!!

import math
[x for x in range(2, 21) if  all(x % y != 0 for y in range(2, int(math.sqrt(x + 1)) ) )]

可以使用 lambda 函数将代码缩短为一行:

prime = list(filter(lambda x:all(x % y !=0 for y in range(2,x)),range(2,11)))
print(prime)

使用此代码查找给定范围内的素数。

>>> lower = int(input("Enter lower range: "))

>>> upper = int(input("Enter upper range: "))

>>> [x for x in range(lower, upper+1) if x>1 if all(x % y != 0 for y in range(2, x))]

这里有一个生成1000以内质数的例子!同样可以用于任何范围。

primes = [num for num in range(2,1000) if True not in [True for divisor in range(2,(int(num/2)+1)) if num % divisor == 0 and num != 2]]