【问题标题】:Finding prime numbers using list comprehention使用列表推导查找素数
【发布时间】:2015-06-25 08:50:02
【问题描述】:

我试图生成 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]

我知道这件事缺少告诉表达式应该检查 range (2,x) 中的所有 y 的选项,并且当且仅当所有都满足此条件时才返回 true。

我们如何做到这一点?

【问题讨论】:

    标签: python math list-comprehension


    【解决方案1】:

    使用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]
    

    【讨论】:

    • 如果它只运行到 sqrt(x) 会更好。 all 很好用,我现在知道我可以在多少地方使用它了。
    • 您可以使用range(2, int(x ** 0.5) + 1)。 (int用来避开TypeError
    • 不错的解决方案!唯一的问题是它不应该检查到 x。我得到了这个。不幸的是,它没有得到 2 作为素数。: [x for x in range(2,2000) if all([x % y for y in range(2,math.ceil(math.sqrt(x)) + 1)])]
    【解决方案2】:

    使用集合推导的一种方法可以是

    list(set(range(2,11)) - {x for x in range(11) for y in range(2,x) if x%y == 0})
    

    【讨论】:

      【解决方案3】:

      您可以使用平方根的概念进行更多优化,以免遍历整个列表并通过以下方式更快地计算素数!!

      import math
      [x for x in range(2, 21) if  all(x % y != 0 for y in range(2, int(math.sqrt(x + 1)) ) )]
      

      【讨论】:

        【解决方案4】:

        @falsetru 的回答是正确的。而且,应该注意优化的代码。正如有人在 Kasra 的回答中的 cmets 中所说的那样

        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
        

        【讨论】:

        • 使用sqrt的代码错误。它返回非质数。它应该类似于int(math.sqrt(x)) + 1
        【解决方案5】:

        带过滤器的版本:

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

        【讨论】:

          【解决方案6】:

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

          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)
          

          【讨论】:

            【解决方案7】:

            使用 lambda 函数可以将代码缩短为一行:

            prime = list(filter(lambda x:all(x % y !=0 for y in range(2,x)),range(2,11)))
            print(prime)
            

            【讨论】:

              【解决方案8】:

              使用此代码查找给定范围内的素数。

              >>> 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))]
              

              【讨论】:

              • 这与使用相同列表理解的其他答案有何不同?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-07-23
              • 1970-01-01
              • 2020-09-25
              • 1970-01-01
              • 2011-07-24
              • 1970-01-01
              • 2020-05-07
              相关资源
              最近更新 更多