2015-06-25 30 views
6

Próbowałem wygenerować wszystkie liczby pierwsze w zakresie od x do y. Próbowałem prosty przykład pierwszy: range(10,11) co oznacza, aby sprawdzić, czy 10 jest liczbą pierwszą:
Tu jest mój kodu:Znajdowanie liczb pierwszych przy użyciu kompilacji listy

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] 

wiem, że coś brakuje opcji powiedzieć wyrażenie x%y != 0 powinna być sprawdzana dla wszystkich w range (2,x) i zwracają wartość true, wtedy i tylko wtedy, gdy wszyscy spełnili ten warunek.

Jak to robimy?

Odpowiedz

15

Zastosowanie all sprawdzić wszystkie elementy (od 2 do połowy X-1) spełnione warunki:

>>> [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

Mogłoby być lepiej, gdyby zabrakło tylko upto sqrt (x). Przyjemne użycie 'all', wiem teraz, ile miejsc mogłem go użyć. –

+0

Możesz użyć' range (2, int (x ** 0,5) + 1) '. ('int' służy do uniknięcia' TypeError') – falsetru

+0

Ładne rozwiązanie! Jedyną rzeczą jest, że nie powinno się sprawdzać do x. Mam to. Niestety, nie dostaje 2 jako liczby pierwszej .: [x dla x w zakresie (2,2000), jeśli wszystkie ([x% y dla y w zakresie (2, math.ceil (math.sqrt (x)) + 1)])] – peterb

1

wersji z filtrem:

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

Jednym ze sposobów, stosując zestaw zrozumienie może być

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

@ Odpowiedź falsetru jest poprawna. Ale także należy zwrócić uwagę na zoptymalizowany kod. Jak ktoś powiedział w komentarzach w odpowiedzi Kasra za

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

Kod, który używa 'sqrt' jest niepoprawny. Zwraca liczby inne niż liczby pierwsze. Powinno to być coś w stylu 'int (math.sqrt (x)) + 1'' – falsetru

+0

@falsetru ok, dzięki! –

1

Program na znalezienie liczb pierwszych w danym zakresie używając wyrażeń listowych:

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)