
Bonjour à tous,
L’article d’aujourd’hui s’attaquera à vous présenter les listes en compréhension en Python. Les listes en compréhension sont des outils puissants et élégants de la programmation en Python. Elles permettent de créer des listes de manière concise et efficace en utilisant une syntaxe simple et intuitive. Nous allons explorer ensemble les différentes façons d’utiliser les listes en compréhension.
Qu’est-ce qu’une liste en compréhension ?
C’est quoi une liste en compréhension. Nous avons déjà vu les listes et leur utilisation dans cet article. Maintenant décortiquons cette façon de créer des listes. Une liste en compréhension est une expression Python qui permet de créer une nouvelle liste à partir d’une autre.
Vous trouverez en anglais le terme « list comprehension ». Ce terme est apparemment dérivé de « set comprehension » qui est un concept mathématique pour « décrire des ensembles » plutôt que de les écrire exhaustivement.
Pour exemple, l’ensemble des nombres pairs strictement inférieurs à 8 peut s’écrire [0, 2, 4, 6] de manière exhaustive. Ou on peut le décrire de la manière suivante : ensemble de nombres entiers naturels pairs strictement plus petit que 8. Dans cet exemple l’une ou autre méthode ne change pas la face du monde. Cependant si maintenant vous cherchez une liste qui va jusqu’à 10 millions, bon courage pour l’écrire de manière exhaustive.
On trouve aussi le terme « liste en intension ». Le « Intension » avec un « S » s’oppose au terme « extension ». L’intension concerne la définition et l’extension l’ensemble des choses sur lesquelles l’intension (la définition) s’applique.
Pour résumé, une liste en compréhension permet de « définir » une liste de manière élégante et concise. Voici la syntaxe générale pour créer une liste en compréhension.
[expression for element in sequence]
PythonCette syntaxe signifie que pour chaque élément de la séquence, l’expression sera évaluée et le résultat ajouté à la nouvelle liste. Une liste en compréhension se remarque par ses crochets autour.
Les avantages des listes en compréhension
Les listes en compréhension offrent plusieurs avantages par rapport à la création de listes traditionnelles. Tout d’abord, elles permettent de créer des listes de manière concise et élégante. Vous allez me dire qu’au début, ça ne nous fera ni chaud ni froid de faire quelque chose d’élégant, on cherchera à faire quelque chose qui marche. Et vous avez raison ! Néanmoins, vous verrez que plus vous avancerez dans le développement de vos outils automatiques plus vous chercherez à écrire un code élégant et concis.
Deuxièmement, les listes de compréhension peuvent souvent être plus performantes que les méthodes traditionnelles de création de listes. On observe dans l’exemple ci-dessous un gain de 10% avec l’utilisation de liste en compréhension. Ce gain est aussi à relativiser avec la complexité de l’opération à réaliser.
import time
n = 10**7
liste = []
start = time.time()
for i in range(n):
liste.append(i**3)
dt1 = time.time() - start
print(f"Boucle for classique : {dt1:.2f}s")
start = time.time()
liste = [i**3 for i in range(n)]
dt2 = time.time() - start
print(f"Liste en compréhension : {dt2:.2f}s")
diff = (dt1 - dt2) / dt1 *100
print(f"Différence de {diff:.1f}%")
Python>>> Boucle for classique : 3.73s
>>> Liste en compréhension : 3.25s
>>> Différence de 12.7%
PythonLes limites des listes en compréhension
Bien que les listes en compréhension soient un outil puissant de la programmation en Python, elles ont quelques limites. Tout d’abord, les expressions utilisées dans les listes en compréhension peuvent parfois être difficiles à comprendre si elles sont trop complexes. Si vous mettez des boucles imbriquées avec des conditions, cela peut vite devenir incompréhensible.
De plus avec les listes en compréhension, vous ne pouvez pas voir ce qu’il se passe dans la boucle. Ainsi, si vous n’êtes pas sûr à 100% de ce que vous faîtes, vous pouvez générer des erreurs dans votre programme sans vous en rendre compte.
Création d’une liste en compréhension avec la boucle for
Les listes en compréhension se génère à partir d’un élément itérable. Cela peut être une chaîne de caractère, une liste ou la fonction range que je présente dans mon article sur les boucles. Voici quelques exemples d’utilisation des listes en compréhension.
chaine_caracteres = "BLOG"
liste_compr = [car + "_" for car in chaine_caracteres]
print(liste_compr)
>>> ['B_', 'L_', 'O_', 'G_']
n = len(chaine_caracteres)
liste_compr = [chaine_caracteres[i] + str(i) for i in range(n)]
>>> ['B0', 'L1', 'O2', 'G3']
PythonDes listes en compréhension imbriquées
Vous pouvez bien sûr imbriquées des boucles « for » comme vous le feriez normalement avec des blocs indentés.
liste_compr = [x*y for x in range(2,4) for y in range(2,5)]
print(liste_compr)
>>> [4, 6, 8, 6, 9, 12]
PythonUne liste en compréhension avec une condition
Dans une liste en compréhension, vous pouvez également rajouter des conditions ce qui vous permettra de filtrer les valeurs. Dans l’exemple suivant, nous bouclerons de 0 à 9 et nous ajouterons à la liste les nombres impairs via la fonction modulo « % ».
liste_compr = [i for i in range(10) if i % 2 == 1]
print(liste_compr)
>>> [1, 3, 5, 7, 9]
PythonLes générateurs
Les générateurs sont objets sur lesquels vous pourrez itérer. Ils sont construits de manière similaire aux listes en compréhension mais à la place des crochets, on retrouve des parenthèses.
Python gérera un générateur comme séquence sur laquelle il devra itérer. Pour obtenir la valeur suivante, vous devrez utiliser l’instruction « next() » avec entre les parenthèses, le nom du générateur.
generateur = (2*i for i in range(6)) # créé un générateur de nombres paires de 0 à 10
generateur
next(generateur)
>>> 0
next(generateur)
>>> 2
for g in generateur:
print(g)
>>> 4
>>> 6
>>> 8
>>> 10
PythonLa force d’un générateur est de ne pas avoir à évaluer tous les éléments qui le constitue. En fonction de l’avancement du programme, il évaluera la valeur qui lui sera demandée. De plus, ce qui est très intéressant dans l’exemple précédent, c’est qu’il possible de travailler manuellement dessus. En effet, les deux premières instructions « next » appellent les deux premières valeurs qui composent le générateur. Quand on rentre dans la boucle « for », le programme sait où il en est dans ce générateur et continue la liste là où on l’avait laissée.
Pour finir sur les listes en compréhension en Python
Pour conclure sur cet article, la liste en compréhension est une syntaxe que vous retrouverez souvent. En effet, c’est une façon de coder élégante, efficace et compacte ! Les listes en compréhension vous permettront de créer des listes très facilement mais vous pourrez également travailler avec des générateurs.
N’hésitez pas à laisser un commentaire, j’y répondrai avec plaisir,
Merci de m’avoir lu,
A bientôt,
Benjamin