2014-06-20 2 views
3

리스트 comprehensions에 대해 머리를 맞대고 파이썬의리스트 연산에서리스트를 다루려는 시도.No Primes list Comprehension

이 가이드 http://www.secnetix.de/olli/Python/list_comprehensions.hawk에서 나는 첫 번째 줄에서 무슨 일이 일어나는지 알 수 없습니다.

>>> noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)] 
>>> primes = [x for x in range(2, 50) if x not in noprimes] 
>>> print primes 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] 

그래서 필자는 그것을 시각화하기 위해 필통으로 집어 넣었습니다. 그래서 나는 i, j의 각 값에 대해 (2,4) (2,6) (2,8), (3,6) (3, 9) (3, 12) 등을 볼 수 있습니다. 그러나 나는 이해할 수 없습니다. 문장 속에서 정확히 무슨 일이 일어나고 있는지.

나를 위해 일하는 것이 매우 유용하게되는 큰 걸림돌입니다. 나는 그것을 젤로 만들 수 없으며, 분명히 저에게 "읽기"가 아닙니다.

+2

에라 토 스테 네스 시브 (http://ot.wikipedia.org/wiki/Sieve_of_Eratosthenes –

답변

3

라인

noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)] 

은 동일하다 :

noprimes = [] 
for i in range(2,8): 
    for j in range(i*2, 50, i): 
    noprimes.append(j) 

및 광고

0,123,516

의 선

for j in range(i*2, 50, i): 
    noprimes.append(j) 

숫자의 시퀀스를 생성 주석에 대한 응답으로,

primes=[] 
for x in range(2,50): 
    if x not in noprimes: 
    primes.append(x) 

업데이트 :

primes = [x for x in range(2, 50) if x not in noprimes] 

은 동일합니다. 시작 번호는 2*i이고 증가는 i이며 시퀀스는 50에 도달하기 전에 중지됩니다. i = 3, 그것은 수 6 9 12 ... 48

등의 시퀀스를 생성 할 때

i = 2, 그것은 수 4 6 8 ... 48

의 시퀀스를 생성

전체 루프의 다음 번호를 생성

 
4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 
6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 
8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 
10, 15, 20, 25, 30, 35, 40, 45, 
12, 18, 24, 30, 36, 42, 48, 
14, 21, 28, 35, 42, 49 
+0

j)의 범위가 (i * 2, 50, i)에 해당하는 멋진 한 줄입니다. – sayth

+0

@sayth 제 업데이트를 참조하십시오. –

1
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)] 

이것은 다음과 동등하다 :

noprimes = [] 
for i in range(2, 8): 
    for j in range(i*2, 50, i): 
     noprimes.append(j) 
1

먼저 구성하십시오 noprimes, 복합 번호 목록입니다. i은 2 내지 7의 범위이다. i이 2 일 때, j은 4, 6, 8, 등을 반복한다. i이 3이면 j은 6, 9, 12, 등입니다. 따라서 noprimes은 최대 49 (그 중 일부는 여러 번)까지 모든 합성 숫자를 포함하게됩니다.

그런 다음 primesnoprimes에없는 2에서 49까지의 모든 숫자를 사용합니다.