如何使用1到10的列表推导生成素数列表?

时间:2017-11-17 07:41:16

标签: python

所以,我已经制作了这段代码:

y = 10
prime_num = [x for x in range(1,y) if y%x != 0]

它回复了我:

  

[3,4,6,7,8,9]

这段代码的目的是生成1到10之间的素数,它给我一个奇数,我不安静得到。我期待这个工作,因为我的列表理解是一个尝试的复制品:

def is_prime(x):
    if x < 2:
        return False
    else:
        for n in range(2, x-1):
            if x % n == 0:
                return False
        return True

我从codecademy创建的,我只是简单地改变了&#34; x%n == 0&#34;到&#34; x%n!= 0&#34;。

4 个答案:

答案 0 :(得分:1)

我不认为你的代码遵循codeacacdemy的给定代码。这有点接近codeacademy的代码

y = 10
factor_array = [x for x in range(2,y) if y%x == 0 ]
if not factor_array :
  print("prime")
else : 
  print ("composite")

答案 1 :(得分:0)

根据您的问题,目前尚不清楚问题是什么,以及您期望使用哪种工具。

如果你想仅使用列表理解来获得第一个n的列表,我担心这不是非常有效,因为没有直接的方法来了解将要有多少个对象事先生成。

如果您希望获得给定范围内的素数,例如低于某个数字num,则可以通过以下方式实现(或多或少):

num = 10
primes = [
    x for x in range(2, num)
    if all([x % f != 0 for f in range(2, x - 1)])]

但是,如果你定义一个素数测试函数(比如is_prime()),那么对于大数字你可以获得更好的表现。

在这种情况下,代码将显示为:

num = 10
primes = [x for x in range(2, num) if is_prime(x)]

请注意,您提供的is_prime()实施效率不高。

此外,通过直接解决某些极端情况,可能有更有效的方法来实现这一点,例如:

num = 10
primes = ([] if num < 2 else [2]) + [x for x in range(3, num, 2) if is_prime(x)]

答案 2 :(得分:0)

您的代码只关注可能的素数x是否均分10。这不是对素性的考验。

cap = 10
prime_nums = [2] + [x for x in range(3, cap+1, 2) if
                    all(x%z!=0 for z in range(2, int(x**(0.5))+1))]

您的主要测试是:

all(x % z != 0 for z in range(2, int(x**(0.5))+1))
#   ^ not divisible by anything in the range of...
#                       ^ [2..sqrt(x)]

答案 3 :(得分:0)

您的代码目前正在做什么

[x for x in range(1,y) if y%x != 0]

您遍历范围 [1,y)并检查 y 是否可被 x 整除。您的代码目前生成 [1,y)\ Divisors(y),这显然不是您想要的。相反,您希望对 x 执行素性测试,以及如何执行此操作如下所述。

你应该做什么

您应该稍微改变列表理解,因为您实际上从不使用 is_prime

prime_nums = [x for x in range(2, y + 1) if is_prime(x)]

顺便说一下,访问this thread可以显着提高素性测试的效率。

如果您想避免使用is_prime()功能,可以使用以下代码:

prime_nums = [x for x in range(2, y + 1) if all(x%k for k in range(2, x-1))]