使用列表理解查找素数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用列表理解查找素数相关的知识,希望对你有一定的参考价值。

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

我们怎么做?

答案

使用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]
另一答案

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

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
另一答案

带过滤器的版本:

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

使用列表推导来查找给定范围内的素数的程序:

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)

以上是关于使用列表理解查找素数的主要内容,如果未能解决你的问题,请参考以下文章

查找 i*i+1 是不是为素数,汇编语言

有没有办法优化此代码以查找数字的除数?

华为机试题 HJ60查找组成一个偶数最接近的两个素数

华为机试题 HJ60查找组成一个偶数最接近的两个素数

在方向更改时保留列表片段中的列表

在使用列表推导生成素数时使用`all()`函数