使用list comprehention查找素数

时间:2015-06-25 08:50:03

标签: python math list-comprehension

我试图生成范围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。

我们该怎么做?

6 个答案:

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