我试图生成范围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)
中所有y的选项,当且仅当所有人都满足这个条件时才返回true。
我们该怎么做?
答案 0 :(得分:21)
使用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]
答案 1 :(得分:2)
您可以使用平方根的概念进行更多优化,以免遍历整个列表并通过以下方式更快地计算素数!!
import math
[x for x in range(2, 21) if all(x % y != 0 for y in range(2, int(math.sqrt(x + 1)) ) )]
答案 2 :(得分:1)
带过滤器的版本:
filter(lambda x:all(x % y != 0 for y in range(2, x)), range(2, 13))
答案 3 :(得分:1)
使用集合理解的一种方法可以是
list(set(range(2,11)) - {x for x in range(11) for y in range(2,x) if x%y == 0})
答案 4 :(得分:1)
@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
答案 5 :(得分:1)
使用列表推导编程以查找给定范围内的素数:
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)