Розуміння набору Python


81

Тож у мене є ці дві проблеми для домашнього завдання, і я застряг у другій.

  1. Використовуйте розуміння набору Python (еквівалент Python нотації конструктора наборів), щоб сформувати набір усіх простих чисел менше 100. Згадайте, що просте число - це ціле число, яке більше 1, і не ділиться на будь-яке ціле число, крім сам і 1. Зберігайте набір простих чисел у змінній (вона вам знадобиться для додаткових частин). Виведіть набір простих чисел (наприклад, за допомогою функції друку).

  2. Використовуйте розуміння набору Python, щоб сформувати набір упорядкованих пар (кортежів довжиною 2), що складається з усіх простих пар, що складаються з простих чисел менше 100. Проста пара - це пара послідовних непарних чисел, які обидва є простими. Зберігайте свій набір основних пар у змінних. Ваш набір номер 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 так само, як ви писали б відповідь за допомогою звичайних математичних нотацій.

Вся ідея набору розумінь полягає в тому, щоб дозволити нам писати і міркувати в коді так само, як ми робимо математику вручну.

Маючи в руках відповідний предикат, задача 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)}

Зверніть увагу, як цей код є прямим перекладом специфікації задачі: "Основна пара - це пара послідовних непарних чисел, які обидва є простими".

PS Я намагаюся дати вам правильну техніку розв’язання задач, фактично не даючи відповіді на домашнє завдання.


2
Хоча проблему 2 можна спростити до простого перебору результату з проблеми 1, як натякається в інструкції.
тричі

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не є необхідним.
четверте око

2
виправлено, дякую, чомусь я подумав, що прості числа можуть бути парними
льодові дерева

2
Чомусь я не бачу, які з них відсутні. Я отримую набір ([(29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11, 13)]). Яких пар не вистачає? Ви вже застосували умову (бути первинним) до r, тому код повинен бути нормальним.
крижані дерева

Ні, ви абсолютно праві. У мене було враження (7,11) та (13,17) тощо ... були включені до основних пар, оскільки вони були технічно "послідовними" у списку простих чисел. Але тепер я розумію.
user3308790
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.