2014-02-14 5 views
39

그래서 숙제를 위해이 두 가지 문제가 있으며 두 번째 과제에 붙어 있습니다.파이썬 세트 이해

  1. 소수는 정수이다 미만 100 리콜있는 소수의 모든 세트를 생성하는 파이썬 세트 이해를 (조건 제시 법의 파이썬의 상응하는)를 사용하여보다 큰 1 소수 이외의 정수로 나눌 수 없습니다. 변수에 소수의 집합을 저장하십시오 (추가 부분을 위해 필요함). 당신의 primes 세트를 출력하십시오 (예 : 인쇄 기능 포함).

  2. 파이썬 집합 이해를 사용하여 100 미만의 소수로 구성된 모든 쌍으로 구성된 순서쌍 (길이가 2 인 튜플 세트)을 생성합니다. 프라임 쌍은 둘 다 연속되는 홀수 쌍입니다 초기. 변수에 프라임 쌍 세트를 저장하십시오. 1 번 세트가 도움이 될 것입니다. Prime Pairs 세트를 출력하십시오. 첫 번째의 경우

이 완벽하게 작동합니다 :

r= {x for x in range(2, 101) 
if not any(x % y == 0 for y in range(2, x))} 

는 그러나, 나는 꽤 두 번째에 난처한 해요. 나는 세트 r의 데카르트 제품을 무언가로 가져야 만할지 모르지만 나는 확실하지 않습니다.

다소 가까워 지지만 연속적인 쌍을 원합니다.

cart = { (x, y) for x in r for y in r 
    if x < y } 

답변

32
primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))} 

(소수의 큰 세트 느릴지라도) - if all(x%y 대신

if not any(not x%y의 I는 Y의 범위 한정 ; 제수> sqrt (x)를 테스트 할 필요가 없습니다. 따라서 max (x) == 100은 최대 (y) == 10을 의미합니다. x < = 10의 경우 y는 < x 여야합니다.

pairs = {(x, x+2) for x in primes if x+2 in primes} 

소수 쌍을 생성하고 테스트하는 대신 하나를 가져와 해당 상위 소수가 존재하는지 확인하십시오.

2

이 같은 쌍을 생성 할 수 있습니다

{(x, x + 2) for x in r if x + 2 in r} 

그럼 어떻게 남아있는 모든 이미 첫 번째 예제에서 수행 한 이는 그들이 주요하게 조건을 얻을 수 있습니다.

을 수행하는 다른 방법 : I 시험을 약간 단순화

{(x, y) for x in r for y in r if x + 2 == y} 
+2

나는 왜 더 나은 방법이 더 좋은지 잘 모르겠습니다. OP는 이미'r'에 100 미만의 소수가 있으므로'{r에 x + 2 인 경우 r에있는 x에 대해 {(x, x + 2)} '만으로 충분합니다. – DSM

+1

네 말이 맞아, 나는 그의 코드를 잘못 읽었다. 감사. – icedtrees

+1

'x % 2 == 1 '은 필요하지 않습니다. – thefourtheye

9

적절한 술어를 도우미 함수로 빌드하여 깨끗하고 명확한 솔루션을 얻을 수 있습니다. 다른 말로하면 정규 수학 집합 표기법으로 답을 쓰는 것과 같은 방식으로 Python 집합 작성 기 표기법을 사용하십시오.

집합 내재적이면의 모든 생각은 우리가 수학을 손으로하는 것과 같은 방식으로 코드 작성하고 추론하게하는 것입니다."이 코드는 문제 사양의 직접적인 번역이 얼마나

low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)} 

참고 : 손에 적절한 조건으로

는 문제 1로 단순화

low_primes = {x for x in range(1, 100) if is_prime(x)} 

그리고 문제 2로 단순화 Prime Pair는 두 개의 프라임이되는 연속적인 홀수 쌍입니다. "

P. 저는 숙제 문제에 대한 해답을 실제로주지 않고도 올바른 문제 해결 기법을 제공하려고 노력하고 있습니다.

+1

문제 2는 frim 문제 1을 루핑하는 것으로 단순화 할 수 있지만 지침에 암시되어 있습니다. – tripleee