使用列表理解查找素数
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]]
我试图生成 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]]