Python >> Tutoriel Python >  >> Python

Python Tuple Comprehension n'existe pas - Utilisez ceci à la place

Python a la compréhension de liste et la compréhension de dictionnaire comme un moyen concis de créer une liste ou un dictionnaire en modifiant un itérable existant.

Python a également des expressions de générateur qui vous permettent de créer un itérable en modifiant et potentiellement en filtrant chaque élément dans un autre itérable et en passant le résultat dans une fonction, par exemple.

Python a-t-il une déclaration de compréhension de tuple ? Et pourquoi ou pourquoi pas? Et quoi utiliser à la place sinon ?

Ce tutoriel répondra à toutes vos questions, mais d'abord, répétons les trois concepts associés :

  • compréhension de la liste,
  • compréhension du dictionnaire,
  • expression de générateur

Si vous connaissez déjà bien ces concepts, allez-y et passez directement à la fin du tutoriel ! 🧑‍💻

Compréhension de la liste

La compréhension de liste est une manière compacte de créer des listes. La formule simple est [expression + context] .

  • Expression : Que faire de chaque élément de la liste ?
  • Contexte : Quels éléments sélectionner ? Le contexte consiste en un nombre arbitraire de for et if déclarations.

L'exemple [x+100 for x in range(3)] crée la liste [100, 101, 102] .

lst = [x for x in range(3)]
print(lst)
# [100, 101, 102]

💡 En savoir plus :Compréhension de liste en Python — Un guide illustré utile

Compréhension du dictionnaire

Compréhension du dictionnaire est un moyen concis et économe en mémoire pour créer et initialiser des dictionnaires dans une ligne de code Python.

Il se compose de deux parties :l'expression et le contexte.

  • L'expression définit comment mapper les clés aux valeurs.
  • Le contexte boucle sur un itérable à l'aide d'une boucle for sur une seule ligne et définit les paires (clé, valeur) à inclure dans le nouveau dictionnaire.

L'exemple suivant montre comment utiliser la compréhension du dictionnaire pour créer une correspondance de femmes à hommes :

men = ['Bob', 'Frank', 'Pete']
women = ['Alice', 'Ann', 'Liz']

# One-Liner Dictionary Comprehension
pairs = {w:m for w, m in zip(women, men)}

# Print the result to the shell
print(pairs)
# {'Bob': 'Alice', 'Frank': 'Ann', 'Pete': 'Liz'}

Regardez également la vidéo suivante pour un récapitulatif rapide sur la compréhension du dictionnaire :

💡 En savoir plus :Compréhension du dictionnaire Python :un didacticiel puissant en une seule ligne

Définir la compréhension

La compréhension des ensembles est une manière concise de créer des ensembles en Python en utilisant la notation des accolades {expression for element in context} .

Par exemple, {x for x in range(10)} crée l'ensemble {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} .

s = {x for x in range(10)}
print(s)
# {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

Vous pouvez éventuellement ajouter une condition pour restreindre le contexte dans {expression for element in context if condition} .

Par exemple, {x for x in range(10) if x>5} crée l'ensemble {6, 7, 8, 9} .

s = {x for x in range(10) if x>5}
print(s)
# {6, 7, 8, 9}

💡 En savoir plus :Compréhension d'ensemble Python

Expression de générateur

Une fonction génératrice est un moyen Pythonique de créer un itérable sans le stocker explicitement en mémoire. Cela réduit l'utilisation de la mémoire de votre code sans entraîner de coûts supplémentaires.

L'expression de générateur suivante montre comment vous pouvez utiliser une instruction de type list-comprehension mais la passer dans le sum() fonction qui attend un itérable :

print(sum(random.random() for i in range(1000)))

Le code se compose des parties suivantes :

  • Le print() fonction affiche le résultat de l'expression dans le shell.
  • Le sum() la fonction additionne toutes les valeurs dans l'itérable suivant.
  • L'expression du générateur random.random() for i in range(1000) génère 1000 nombres aléatoires et les alimente dans la fonction externe sum() sans les créer tous à la fois.

De cette façon, nous ne stockons toujours pas toute la liste des 1000 numéros en mémoire mais les créons dynamiquement.

Il y a deux gros avantages à utiliser un générateur :

  • (1) Vous n'avez pas besoin de créer d'abord une liste énorme et de la stocker en mémoire, mais de générer l'élément suivant au fur et à mesure que vous l'itérez.
  • (2) C'est plus court et plus concis.

💡 En savoir plus :Générateur de ligne Python

Compréhension des tuples

Compréhension de tuple telle que (x+100 for x in range(3)) n'existe pas en Python pour deux raisons principales :

  • Ambiguïté : L'expression (x+100 for x in range(3)) pour la compréhension de tuple serait ambigu à cause des parenthèses (...) . Cela pourrait également signifier "créer une expression de générateur et utiliser la priorité indiquée par la parenthèse" . Dans ce cas, Python ne saurait pas s'il doit renvoyer un tuple ou un générateur. C'est la principale raison pour laquelle la compréhension des tuples n'existe pas.
  • Style Python :Si vous souhaitez créer dynamiquement une structure de données de conteneur et la remplir de valeurs, vous devez utiliser des listes. Les listes sont faites pour boucler ; tuples pour les structures. Les listes sont homogènes; tuples hétérogènes. Listes de longueur variable.

Alternatives de compréhension des tuples

Vous pouvez utiliser les alternatives suivantes au lieu de la compréhension de tuple :

  • tuple(x+100 for x in range(3) ) crée le tuple (100, 101, 102) à l'aide d'une expression de générateur.
  • (1, *[x+100 for x in range(3)]) crée le tuple (1, 100, 101, 102) combinant la création manuelle de tuples avec la compréhension de liste.

Vous pouvez trouver ces deux exemples dans l'extrait de code suivant :

# Tuple Comprehension Alternative 1
t = tuple(x+100 for x in range(3))
print(t)
# (100, 101, 102)


# Tuple Comprehension Alternative 2
t = (1, *[x+100 for x in range(3)])
print(t)
# (1, 100, 101, 102)