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