Это должно сделать это.
import math
n = 100
DOUBLE = 2
divisors = [i for i in range(DOUBLE, math.ceil(n/DOUBLE))]
#Get primes
print(list(set(range(2, n)) - set([ item*item2 for item in divisors for item2 in divisors]))[::-1])
#[97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2]
Цикл for
for item in divisors:
for item2 in divisors:
non_primes += [item*item2]
преобразуется в
[ item*item2 for item in divisors for item2 in divisors]
Также, как предлагается в комментарии, вы можетеупростите двойной цикл for, используя itertools.product , как показано ниже.
import math
import itertools
n = 100
DOUBLE = 2
divisors = [i for i in range(DOUBLE, math.ceil(n/DOUBLE))]
#Find all combinations of divisors
prod = itertools.product(divisors, repeat=2)
#Run through all combinations to get non primes
non_primes = [t[0]*t[1] for t in prod]
#Get primes
print([item for item in list(range(2, n)) if item not in non_primes][::-1])
Вместо того, чтобы задавать разницу, вы также можете сделать
import math
import itertools
n = 100
DOUBLE = 2
divisors = [i for i in range(DOUBLE, math.ceil(n/DOUBLE))]
#Find all combinations of divisors
prod = itertools.product(divisors, repeat=2)
#Run through all combinations to get non primes
non_primes = [t[0]*t[1] for t in prod]
#Get primes
print([item for item in list(range(2, n)) if item not in non_primes][::-1])