2015-06-25 3 views
6

Я пытался сгенерировать все простые числа в диапазоне от x до y. Я попробовал простой пример первый: range(10,11), что означает, чтобы проверить, если 10 есть простое число:
Вот мой код:Поиск простых чисел с использованием списка сравнения

prime_list = [x for x in range(10, 11) for y in range(2,x) if x % x == 0 and x % 1 == 0 and x % y != 0] 

Я знаю, что вещь отсутствует возможность сказать выражение, x%y != 0 должно быть проверено для всех y в range (2,x) и верните true тогда и только тогда, когда все они выполнили это условие.

Как мы это сделаем?

ответ

15

Используйте all, чтобы проверить все элементы (от 2 ДО X-1) встретились условия:

>>> [x for x in range(2, 20) 
    if all(x % y != 0 for y in range(2, x))] 
[2, 3, 5, 7, 11, 13, 17, 19] 
+0

Может быть лучше, если бы он побежал только Шифрование до SQRT (х). Хорошее использование 'all', теперь я знаю, сколько мест я мог бы использовать. –

+0

Вы можете использовать' range (2, int (x ** 0.5) + 1) '. ('int' используется, чтобы избежать' TypeError') – falsetru

+0

Хорошее решение! Единственное, что не следует проверять на x. Я получил это. К сожалению, он не получает 2 в виде простого числа: [x for x in range (2,2000), если все ([x% y для y в диапазоне (2, math.ceil (math.sqrt (x)) + 1)])] – peterb

1

версия с фильтром:

filter(lambda x:all(x % y != 0 for y in range(2, x)), range(2, 13)) 
0

Один из способов, используя множество понимание может быть

list(set(range(2,11)) - {x for x in range(11) for y in range(2,x) if x%y == 0}) 
0

@ Ответ falsetru правильный. Но также следует обратить внимание на оптимизированный код. Как сказал кто-то в комментариях в ответ Kasra в

In [227]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, int(m.sqrt(x)) + 1))] 
100 loops, best of 3: 2.08 ms per loop 

In [228]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, int(m.sqrt(x)) + 1))] 
100 loops, best of 3: 2.09 ms per loop 

In [229]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, x-1))] 
100 loops, best of 3: 10.4 ms per loop 

In [230]: %timeit [x for x in range(4, 1000) if all(x % y != 0 for y in range(2, x-1))] 
100 loops, best of 3: 10.3 ms per loop 
+0

Код, использующий 'sqrt', неверен. Он возвращает непустые числа. Это должно быть что-то вроде 'int (math.sqrt (x)) + 1' – falsetru

+0

@falsetru ok, спасибо! –

1

Программа для поиска простых чисел в заданном диапазоне с использованием списковых:

min = 10 

max = 100 

primes = [num for num in range(min,max) if 0 not in [num%i for i in range(2,int(num/2)+1)]] 

print (primes) 
Смежные вопросы