Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

liste_initiale = range(1,6)
liste_finale = [i*2 for i in liste_initiale]
Exemple de compréhension de liste: Dans cet exemple on construit une nouvelle liste en multipliant chaque élément d'une liste initiale par 2.

Les compréhensions de listes (list comprehensions – en anglais) sont à la fois un outil très pratique et puissant offert par Python – et une des constructions dont la syntaxe est la plus difficile à appréhender.

L'idée de cette construction est de pouvoir facilement effectuer des projections de listes. C'est à dire créer une nouvelle liste dont les éléments sont construits à partir des éléments individuels d'une liste originale.

Un exemple simple

Pas clair? Un exemple va préciser les choses: Supposons que j'ai une liste de titres de films. Celle-ci peut être créée à partir de l'interpréteur Python interactif:

sh$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> films = [
...     "sacré graal",
...     "la vie de brian",
...     "brazil",
...     "l'homme de la manche"
... ]
>>> print films
['sacr\xc3\xa9 graal', 'la vie de brian', 'brazil', "l'homme de la manche"]

Imaginons maintenant que l'on souhaite construire une liste de ces titres, mais avec les initiales des mots capitalisées (à la manière de la fonction standard capwords du module standard string).

Si vous êtes familiers d'autres langages de programmation impératifs comme Java ou C, la solution qui doit vous venir en tête consiste à créer une liste vide, et à y ajouter un à un les éléments capitalisés. Ce qui se traduirait ainsi en Python:

>>> import string
>>> capitalise = []
>>> for i in films:
...     capitalise.append(string.capwords(i))
... 
>>> print capitalise
['Sacr\xc3\xa9 Graal', 'La Vie De Brian', 'Brazil', "L'homme De La Manche"]

Trois lignes de code. Ça n'est pas excessif, mais finalement assez long pour quelque-chose qui s'exprime pourtant simplement en français: Capitaliser chaque élément de la liste.

Or Python se veut un langage expressif. Les compréhensions de listes sont donc la solution pythonesque à ce genre de situation. Et le code ci-dessus peut être ré-écrit ainsi:

>>> capitalise = [string.capwords(i) for i in films]
>>> print capitalise
['Sacr\xc3\xa9 Graal', 'La Vie De Brian', 'Brazil', "L'homme De La Manche"]

Effectivement, la syntaxe est un peu complexe au premier abord. Mais elle se comprend si on prend le soin de décomposer mentalement la compréhension de liste (la partie du code entre crochets) pour la lire de droite à gauche. Ainsi, ce code pourrait être lu:

Filtrage

En plus de faire une projection de un-à-un, les compréhensions de listes de Python permettent aussi de filtrer les éléments. Ainsi, toujours pour reprendre l'exemple précédent, pour obtenir la liste des films contenant plusieurs mots, on peut écrire:

>>> [titre for titre in films if len(titre.split()) > 1]
['sacr\xc3\xa9 graal', 'la vie de brian', "l'homme de la manche"]

Dans cette notation, la section introduite par le if permet de ne conserver que certains éléments parmi ceux contenus dans la liste films.

Produit

Les compréhensions de listes permettent également de construire des listes qui sont le produit cartésien de plusieurs listes (autrement dit, de construire l'ensemble des combinaisons d'éléments de chacune de ces listes):

>>> noms = [
...     'Gilliam',
...     'Palin',
...    'Idle'
... ]
>>> prenoms = [
...     'Terry',
...     'Michael',
...     'Eric'
... ]
>>> [p + " " + n for p in prenoms for n in noms]
['Terry Gilliam', 'Terry Palin', 'Terry Idle', 'Michael Gilliam', 
'Michael Palin', 'Michael Idle', 'Eric Gilliam', 'Eric Palin', 'Eric Idle']

Références