Compréhension De L'Ensemble Python

J'ai donc ces deux problèmes pour un devoir et je suis coincé sur le second.

  1. Utilisez une compréhension D'ensemble Python (L'équivalent de Python de la notation Set Builder) pour générer un ensemble de tous les nombres premiers inférieurs à 100. Rappelons qu'un nombre premier est un entier supérieur à 1 et non divisible par un entier autre que lui-même et 1. Stockez votre ensemble de nombres premiers dans une variable (vous en aurez besoin pour des pièces supplémentaires). Sortie de votre ensemble de nombres premiers (par exemple, avec la fonction d'impression).

  2. Utilisez une compréhension D'ensemble Python pour générer un ensemble de paires ordonnées (tuples de longueur 2) composé de toutes les paires premières composées de nombres premiers inférieurs à 100. Une paire première est une paire de nombres impairs consécutifs qui sont tous deux premiers. Stockez votre ensemble de paires premières dans une variable. Votre ensemble de numéro 1 sera très utile. Sortie de votre ensemble de paires premières.

Pour le premier, cela fonctionne parfaitement:

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

Cependant, Je suis assez perplexe sur le second. Je pense que je devrais peut-être prendre le produit cartésien de l'ensemble r avec quelque chose, mais je ne suis pas sûr.

Cela me rapproche un peu mais je veux juste les paires consécutives.

cart = { (x, y) for x in r for y in r
     if x < y }
46
demandé sur Mel 2014-02-14 08:29:43

3 réponses

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

J'ai simplifié un peu le test - if all(x%y au lieu de if not any(not x%y

J'ai également limité la plage de y; il ne sert à rien de tester les diviseurs > sqrt ( x). Ainsi, max(x) == 100 implique max(y) == 10. Pour x

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

Au lieu de générer des paires de nombres premiers et de les tester, obtenez-en un et voyez si le premier supérieur correspondant existe.

39
répondu Hugh Bothwell 2015-11-08 01:40:17

Vous pouvez obtenir des solutions propres et claires en construisant les prédicats appropriés en tant que fonctions d'assistance. En d'autres termes, utilisez la notation Python set-builder de la même manière que vous écririez la réponse avec une notation mathématique régulière.

L'idée derrière set comprehensions est de nous laisser écrire et raisonner en code de la même manière que nous faisons les mathématiques à la main.

Avec un prédicat approprié en main, le problème 1 simplifie:

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

Et le problème 2 simplifie à:

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

Notez que ce code est une traduction directe de la spécification du problème, "une paire première est une paire de nombres impairs consécutifs qui sont tous deux premiers."

P.S. j'essaie de vous donner la bonne technique de résolution de problèmes sans vraiment donner la réponse au problème des devoirs.

12
répondu Raymond Hettinger 2014-02-14 05:05:09

Vous pouvez générer des paires comme ceci:

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

Alors tout ce qui reste à faire est d'obtenir une condition pour les rendre premiers, ce que vous avez déjà fait dans le premier exemple.

Une façon différente de le faire: (bien que plus lent pour les grands ensembles de nombres premiers)

{(x, y) for x in r for y in r if x + 2 == y}
3
répondu icedtrees 2014-02-14 05:41:27