Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

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 xx2x \rightarrow x^2) à 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);
<Figure size 640x480 with 1 Axes>

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.