web-dev-qa-db-fra.com

Python Définir la compréhension

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

  1. Utilisez a Python Set Comprehension (l'équivalent Python de la notation Set Builder) pour générer un ensemble de tous les nombres premiers inférieurs à 100. Rappelez-vous 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 parties supplémentaires). Sortez votre ensemble de nombres premiers (avec la fonction d'impression, par exemple).

  2. Utilisez a Python Set Comprehension pour générer un ensemble de paires ordonnées (tuples de longueur 2) constituées de toutes les paires premiers composées de nombres premiers inférieurs à 100. Une paire paire est une paire de paires impaires consécutives. Nombres qui sont tous deux premiers Stockez votre ensemble de paires de prime dans une variable. Votre ensemble de numéro 1 sera très utile.

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 prendre le produit cartésien de l’ensemble 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 }
67
user3308790
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 gamme de y; il est inutile de tester les diviseurs> sqrt (x). Donc max (x) == 100 implique max (y) == 10. Pour x <= 10, y doit également être <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 nombre premier le plus élevé existe.

56
Hugh Bothwell

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 écrivez la réponse avec une notation set mathématique normale.

L’idée même de la compréhension des ensembles 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 se résume à:

 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 principale 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 donner la réponse au problème des devoirs.

13
Raymond Hettinger

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

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

Il ne reste plus alors qu’à obtenir une condition pour les rendre optimales, ce que vous avez déjà fait dans le premier exemple.

Une manière différente de le faire: (bien que plus lente pour les grands ensembles de nombres premiers)

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