【问题标题】:Iterate through list and find prime numbers and add to another list遍历列表并找到素数并添加到另一个列表
【发布时间】:2020-06-20 15:36:21
【问题描述】:

我想在 python 中遍历一个列表,检测素数,然后将它们添加到另一个列表中。

primes = []
nprimes = []
for j in range(0, len(arr)):
    num = arr[j] #my list with numbers to check 

    if num > 1:
        for k in range(2, num):
            if (num % k) == 0:
                nprimes.append(num)
                break
            else:
                primes.append(num)
               
    else:
        print(num, " can't be checked, because its smaller than 1")

我的问题是总是添加不是素数的数字。此外,通常代码似乎无法正常工作。

【问题讨论】:

  • 如果该数字不能被数字整除,那么您将添加到列表并中断而不是继续检查下一个数字。
  • break 用于两个条件分支(if 和 else)。你认为for k in range(2, num): 真的会循环使用该设置吗?

标签: python arrays python-3.x list primes


【解决方案1】:

如果num % k == 0 为假,你不能直接说它是prime,你必须等待整个循环,所以将else 与for 循环一起移动,它将在没有break 的情况下执行遇到这意味着它是素数

  • 您可以直接迭代值for num in arr
  • 您可以在 sqrt(num) 停止循环,之后您将找不到新的除数
for num in arr:
    if num > 1:
        for k in range(2, int(num ** 0.5) + 1):
            if num % k == 0:
                nprimes.append(num)
                break
        else:
            primes.append(num)
    else:
        print(num, " can't be checked, because its smaller than 1")

【讨论】:

  • 感谢您的帮助。我刚刚开始学习Python。您的回答帮了大忙。
【解决方案2】:

出于学习目的,让我们使用不同的方法。首先,我建议您将试用除法代码移动到其自己的谓词函数is_prime() 中,该函数返回 True 或 False,因此可以独立于您的其余代码对其进行优化。

然后,我将让itertools.groupby 将列表分为素数和非素数序列,我们将它们拼接到适当的列表中:

def is_prime(number):
    if number < 2:
        return False

    if number % 2 == 0:
        return number == 2

    for divisor in range(3, int(number ** 0.5) + 1, 2):
        if number % divisor == 0:
            return False

    return True

if __name__ == "__main__":

    from random import sample
    from itertools import groupby

    array = sample(range(1, 100), 15)

    primes = []
    composites = []

    for are_prime, numbers in groupby(array, is_prime):
        if are_prime:
            primes.extend(numbers)
        else:
            composites.extend(numbers)

    print("Numbers:", array)
    print("Primes:", primes)
    print("Composites:", composites)

输出

% python3 test.py
Numbers: [91, 87, 10, 2, 11, 24, 21, 12, 46, 61, 15, 32, 57, 22, 5]
Primes: [2, 11, 61, 5]
Composites: [91, 87, 10, 24, 21, 12, 46, 15, 32, 57, 22]
%

有很多方法可以解决这个问题,其中许多方法具有教育意义!

【讨论】:

  • 感谢您的详细解答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2015-03-11
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多