Python-Set-Verständnis

80

Ich habe also diese beiden Probleme für eine Hausaufgabe und stecke bei der zweiten fest.

  1. Verwenden Sie ein Python-Mengenverständnis (Pythons Äquivalent zur Set Builder-Notation), um eine Menge aller Primzahlen zu generieren, die kleiner als 100 sind. Denken Sie daran, dass eine Primzahl eine Ganzzahl ist, die größer als 1 ist und nicht durch eine andere Ganzzahl als geteilt werden kann selbst und 1. Speichern Sie Ihre Primzahlen in einer Variablen (Sie benötigen sie für zusätzliche Teile). Geben Sie Ihre Primzahlen aus (z. B. mit der Druckfunktion).

  2. Verwenden Sie ein Python-Mengenverständnis, um eine Menge geordneter Paare (Tupel der Länge 2) zu generieren, die aus allen Primzahlenpaaren bestehen, die aus Primzahlen unter 100 bestehen. Ein Primzahlpaar ist ein Paar aufeinanderfolgender ungerader Zahlen, die beide Primzahlen sind. Speichern Sie Ihre Prime Pairs in einer Variablen. Ihr Satz Nummer 1 wird sehr hilfreich sein. Geben Sie Ihren Satz Prime Pairs aus.

Für den ersten funktioniert dies perfekt:

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

Allerdings bin ich beim zweiten ziemlich ratlos. Ich denke, ich muss vielleicht das kartesische Produkt des Sets mit etwas nehmen, aber ich bin mir einfach nicht sicher.

Das bringt mich etwas näher, aber ich möchte nur die aufeinanderfolgenden Paare.

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

Antworten:

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

Ich habe den Test etwas vereinfacht - if all(x%ystattif not any(not x%y

Ich habe auch die Reichweite von y begrenzt; Es macht keinen Sinn, nach Teilern> sqrt (x) zu testen. Max (x) == 100 impliziert also max (y) == 10. Für x <= 10 muss y auch <x sein.

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

Anstatt Primzahlenpaare zu generieren und zu testen, holen Sie sich eine und prüfen Sie, ob die entsprechende höhere Primzahl vorhanden ist.

Hugh Bothwell
quelle
14

Sie können saubere und klare Lösungen erhalten, indem Sie die entsprechenden Prädikate als Hilfsfunktionen erstellen. Mit anderen Worten, verwenden Sie die Python-Set-Builder-Notation genauso, wie Sie die Antwort mit der regulären Mathematik-Set-Notation schreiben würden.

Die ganze Idee hinter dem Verständnis von Mengen besteht darin, uns in Code schreiben und argumentieren zu lassen, so wie wir Mathematik von Hand machen.

Mit einem geeigneten Prädikat in der Hand vereinfacht sich Problem 1 zu:

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

Und Problem 2 vereinfacht sich zu:

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

Beachten Sie, dass dieser Code eine direkte Übersetzung der Problemspezifikation ist: "Ein Primpaar ist ein Paar aufeinanderfolgender ungerader Zahlen, die beide Primzahlen sind."

PS Ich versuche, Ihnen die richtige Technik zur Problemlösung zu geben, ohne die Antwort auf das Hausaufgabenproblem zu verraten.

Raymond Hettinger
quelle
2
Obwohl Problem 2 vereinfacht werden kann, um nur das Ergebnis von Problem 1 zu durchlaufen, wie in den Anweisungen angedeutet.
Tripleee
5

Sie können Paare wie folgt generieren:

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

Dann müssen Sie nur noch eine Bedingung erhalten, um sie zur Primzahl zu machen, was Sie bereits im ersten Beispiel getan haben.

Eine andere Art, es zu tun: (Obwohl langsamer für große Mengen von Primzahlen)

{(x, y) for x in r for y in r if x + 2 == y}
Eisbäume
quelle
3
Ich bin mir nicht sicher, warum dein besserer Weg besser ist. Das OP hat bereits Primzahlen von weniger als 100 Zoll r, also {(x, x + 2) for x in r if x + 2 in r}reicht es aus.
DSM
2
and x % 2 == 1ist nicht nötig.
thefourtheye
2
behoben, danke, aus irgendeinem Grund dachte ich, dass Primzahlen gerade sein könnten
Eisbäume
2
Aus irgendeinem Grund sehe ich nicht, welche fehlen. Ich werde gesetzt ([(29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11, 13)]). Welche Paare fehlen? Sie haben die Bedingung (Primzahl) bereits auf r angewendet, daher sollte der Code in Ordnung sein.
Eisbäume
Nein, du hast absolut recht. Ich hatte den Eindruck, dass (7,11) und (13,17) usw. in die Primzahlenpaare aufgenommen wurden, da sie in der Liste der Primzahlen technisch "aufeinanderfolgend" waren. Aber jetzt verstehe ich.
user3308790