Просмотрите список, найдите простые числа и добавьте их в другой список - PullRequest
0 голосов
/ 20 июня 2020

Я хочу перебрать список в 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")

У меня проблема в том, что всегда добавляются числа, которые не являются простыми числами. Также в целом код не работает должным образом.

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Если num % k == 0 ложно, вы не можете сказать, что это prime напрямую, вы должны ждать весь l oop, поэтому переместите else с помощью for l oop, он будет выполнен не встречалось break, что означает простое число

  • вы можете выполнять итерацию непосредственно по значениям for num in arr
  • вы можете остановить свой l oop на 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")
0 голосов
/ 22 июня 2020

В учебных целях давайте поиграем с другим подходом. Во-первых, я рекомендую вам переместить код пробного деления в его собственную функцию предиката 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]
%

Есть go множество способов решить эту проблему, многие из них образовательные!

...