파이썬 집합 이해력


81

그래서 저는 숙제에이 두 가지 문제가 있고 두 번째 문제에 갇혀 있습니다.

  1. Python Set Comprehension (Python의 Set Builder 표기법에 해당)을 사용하여 100보다 작은 모든 소수 집합을 생성합니다. 소수는 1보다 크고 다음 이외의 다른 정수로 나눌 수없는 정수입니다. 그 자체와 1. 소수 집합을 변수에 저장합니다 (추가 부분에 필요합니다). 소수 집합을 출력합니다 (예 : 인쇄 기능 사용).

  2. Python Set Comprehension을 사용하여 100 미만의 소수로 구성된 모든 소수 쌍으로 구성된 정렬 된 쌍 세트 (길이 2의 튜플)를 생성합니다. 소수 쌍은 모두 소수 인 연속 된 홀수 쌍입니다. 소수 쌍 세트를 변수에 저장하십시오. 당신의 1 번 세트는 매우 도움이 될 것입니다. 프라임 페어 세트를 출력합니다.

첫 번째 경우 이것은 완벽하게 작동합니다.

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 }

답변:


69
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

나는 또한 y의 범위를 제한했습니다. 제수> sqrt (x)에 대한 테스트에는 의미가 없습니다. 따라서 max (x) == 100은 max (y) == 10을 의미합니다. x <= 10의 경우 y도 <x 여야합니다.

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

소수 쌍을 생성하고 테스트하는 대신 하나를 얻고 해당하는 더 높은 소수가 있는지 확인하십시오.


14

헬퍼 함수로 적절한 술어를 빌드하여 깨끗하고 명확한 솔루션을 얻을 수 있습니다. 즉, 일반 수학 집합 표기법으로 답을 작성하는 것과 같은 방식으로 Python set-builder 표기법을 사용합니다.

집합 이해의 배후에있는 모든 아이디어는 우리가 손으로 수학을하는 것과 같은 방식으로 코드를 작성하고 추론 할 수 있도록하는 것입니다.

적절한 술어가 있으면 문제 1은 다음과 같이 단순화됩니다.

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

그리고 문제 2는 다음을 단순화합니다.

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

이 코드가 문제 사양을 직접 번역 한 것임을 주목하십시오. "A Prime Pair는 둘 다 소수 인 연속 된 홀수 쌍입니다."

PS 저는 숙제 문제에 대한 답을 실제로주지 않고 올바른 문제 해결 기술을 제공하려고합니다.


2
문제 2는 지침에 암시 된대로 결과 frim 문제 1을 반복하는 것으로 단순화 할 수 있습니다.
tripleee 2014

5

다음과 같이 쌍을 생성 할 수 있습니다.

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

그런 다음 남은 것은 첫 번째 예에서 이미 수행 한 것처럼이를 프라임으로 만드는 조건을 얻는 것입니다.

다른 방법 : (대규모 집합의 경우 더 느리지 만)

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

3
왜 당신의 더 나은 방법이 더 나은지 잘 모르겠습니다. OP에는 이미 100 미만의 소수가 r있으므로 {(x, x + 2) for x in r if x + 2 in r}충분합니다.
DSM

2
and x % 2 == 1필요가 없습니다.
thefourtheye 2014

2
고정, 감사합니다. 어떤 이유로 소수가 짝수
icedtrees

2
어떤 이유로 어떤 것이 누락되었는지 알 수 없습니다. ([(29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11, 13)]). 어떤 쌍이 누락 되었습니까? 이미 조건 (프라임)을 r에 적용 했으므로 코드는 괜찮을 것입니다.
icedtrees 2014

아니 당신이 절대적으로 옳습니다. 나는 (7,11) 및 (13,17) 등이 소수 목록에 기술적으로 "연속적"이기 때문에 소수 쌍에 포함되었습니다. 하지만 이제 이해합니다.
user3308790
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.