【问题标题】:Getting First Prime in a List of Random Numbers在随机数列表中获取第一个素数
【发布时间】:2016-08-19 18:17:15
【问题描述】:

我在玩 Python shell,我认为这是一个非常幼稚的函数实现,它简单地返回 100 个随机生成的数字列表中的第一个素数(其值介于 0 和 99 之间,包括)。代码如下:

>>> def is_prime(n):
    if n < 2:
        return False
    elif n == 2:
        return True
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

>>> from random import randint
>>> numbers = []
>>> for i in range(0, 100):
    numbers.append(randint(0, 99))

>>> def get_first_prime(values):
    temp = []
    for i in values:
        if is_prime(i):
            temp.append(i)
    return temp[0]

>>> get_first_prime(numbers)

我希望这个函数严格返回第一个素数。我的实现使用一个帮助列表来缓存所有素数,然后简单地返回第一个索引处的元素。它有效,但我不相信这是一个好的。我确信有一种更有效的方法可以做到这一点,不需要扫描整个列表,但我似乎还没有想到一个。

有哪些更好的选择?

【问题讨论】:

  • 只是一个小建议:在检查可除性以测试可疑素数时,您不需要检查高于 sqrt(n) 的数字。通过该修改,is_prime(n) 函数中的for 看起来像for i in range(2, int(sqrt(n))): ...(您需要from math import sqrt 才能获得sqrt() 函数可用)。

标签: python python-3.x primes


【解决方案1】:
def get_first_prime(values):
    for i in values:
        if is_prime(i):
            return i

这样一来,您就不会在找到素数后继续搜索。如果没有找到素数,该函数会隐式返回 None

【讨论】:

  • 哦,哇,我知道有一种不那么复杂的方法。谢谢你,先生!
【解决方案2】:

是的,您甚至不需要生成所有随机数的列表,您可以在生成每个随机数时对其进行测试,并在找到后立即返回。

from random import randint
import math


def is_prime(n):
    if n < 2:
        return False
    elif n == 2:
        return True
    for i in range(2, int(math.sqrt(n) + 1)):
        if n % i == 0:
            return False
    return True

def get_first_prime(number):
    for i in range(number + 1):
        n = randint(0, 99)
        if is_prime(n):
            return n

get_first_prime(100)

【讨论】:

    【解决方案3】:

    你是对的。您的代码不仅具有更高的时间复杂度(即使在找到第一个素数之后也会遍历所有列表元素)和空间复杂度(保存所有素数的临时列表),而且当没有素数时还有抛出 IndexError 的风险在列表中。

    所以你可以通过以下方式修复它:

    def get_first_prime(values):
        for i in values: 
            if is_prime(i): 
                return i
    

    请注意,当输入中没有素数时,return 语句将永远不会被执行,这意味着没有明确的返回;在这种情况下,Python 返回None。因此,如果您选择这样做,您可以在 for 循环外的函数末尾返回您选择的值,以指示“未找到”。

    def get_first_prime(values):
            for i in values: 
                if is_prime(i): 
                    return i
            return -1
    

    Pythonic 的处理方式是引发异常并让函数的调用者处理异常。

    【讨论】:

      【解决方案4】:
      prime = next(filter(isprime, numbers))
      

      find first element in a sequence that matches a predicate

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-06
        • 2015-09-22
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多