Révision - niveau basique¶
Ce mécanisme très pratique permet de construire simplement une liste à partir d’une autre (ou de tout autre type itérable en réalité, mais nous y viendrons).
Pour l’introduire en deux mots, disons que la compréhension de liste est à l’instruction for ce que l’expression conditionnelle est à l’instruction if, c’est-à-dire qu’il s’agit d’une expression à part entière.
Cas le plus simple¶
Voyons tout de suite un exemple :
depart = (-5, -3, 0, 3, 5, 10)
arrivee = [x**2 for x in depart]
arrivee[25, 9, 0, 9, 25, 100]Le résultat de cette expression est donc une liste, dont les éléments sont les résultats de l’expression x**2 pour x prenant toutes les valeurs de depart.
Remarque : si on prend un point de vue un peu plus mathématique, ceci revient donc à appliquer une certaine fonction (ici ) à une collection de valeurs, et à retourner la liste des résultats. Dans les langages fonctionnels, cette opération est connue sous le nom de map, comme on l’a vu dans la séquence précédente.
Digression¶
# profitons de cette occasion pour voir
# comment tracer une courbe avec matplotlib
%matplotlib inline
import matplotlib.pyplot as plt
plt.ion()<contextlib.ExitStack at 0x7f97341a6660># si on met le départ et l'arrivée
# en abscisse et en ordonnée, on trace
# une version tronquée de la courbe de f: x -> x**2
plt.plot(depart, arrivee);
Restriction à certains éléments¶
Il est possible également de ne prendre en compte que certains des éléments de la liste de départ, comme ceci :
[x**2 for x in depart if x%2 == 0][0, 100]qui cette fois ne contient que les carrés des éléments pairs de depart.
Remarque : pour prolonger la remarque précédente, cette opération s’appelle fréquemment filter dans les langages de programmation.
Autres types¶
On peut fabriquer une compréhension à partir de tout objet itérable, pas forcément une liste, mais le résultat est toujours une liste, comme on le voit sur ces quelques exemples :
[ord(x) for x in 'abc'][97, 98, 99][chr(x) for x in (97, 98, 99)]['a', 'b', 'c']Autres types (2)¶
On peut également construire par compréhension des dictionnaires et des ensembles :
d = {x: ord(x) for x in 'abc'}
d{'a': 97, 'b': 98, 'c': 99}e = {x**2 for x in (97, 98, 99) if x %2 == 0}
e{9604}Pour en savoir plus¶
Voyez la section sur les compréhensions de liste dans la documentation python.