Понимание набора Python

81

Итак, у меня есть эти две задачи для домашнего задания, и я застрял на второй.

  1. Используйте Python Set Component (Python эквивалент нотации Set Builder), чтобы сгенерировать набор всех простых чисел, меньших 100. Напомним, что простое число - это целое число, которое больше 1 и не делится ни на одно целое, кроме сам и 1. Сохраните ваш набор простых чисел в переменной (он понадобится вам для дополнительных частей). Выведите свой набор простых чисел (например, с помощью функции печати).

  2. Используйте Python Set Computing для создания набора упорядоченных пар (кортежей длиной 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 }
user3308790
источник

Ответы:

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, как указано в инструкциях.
Tripleee
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
2
исправлено, спасибо, я почему-то подумал, что простые числа могут быть четными
icedtrees
2
По какой-то причине я не вижу, какие из них отсутствуют. Я получаю набор ([(29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11, 13)]). Какие пары отсутствуют? Вы уже применили условие (простого числа) к r, поэтому код должен быть в порядке.
icedtrees
Нет, ты абсолютно прав. У меня создалось впечатление, что (7,11) и (13,17) и т. Д. Были включены в пары простых чисел, поскольку они технически были «последовательными» в списке простых чисел. Но теперь я понимаю.
user3308790