Les listes en compréhension sont des listes créées grâce à une syntaxe particulière. Cette syntaxe, très puissante, permet en une seule ligne de créer des listes, de toute taille, et contenant une série de valeurs particulières.

Génération de liste

La syntaxe de base pour créer une liste par compréhension est la suivante :

[variable for variable in iterable]

Avec :

  • variable, qu’on peut remplacer par n’importe quel nom. Pour faire court, et pour suivre les conventions mathématiques, on peut utiliser x par exemple ;
  • iterable, qui est une structure de données itérable, comme par exemple une liste ou la fonction range.

La liste créée peut être stockée dans une variable ou bien directement utilisée.

Utilisation avec range

La génération de liste par compréhension grâce à la fonction range est très intéressante. Elle permet de générer facilement une longue série de valeurs qui se suivent, entre une borne minimale et une borne maximale. Voici des exemples :

  • [x for x in range(10)] donnera [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ;
  • [x for x in range(5, 14)] donnera [5, 6, 7, 8, 9, 10, 11, 12, 13].

Utilisation pour copier une liste

La génération de liste par compréhension, à partir d’une liste déjà existante est aussi possible (dans ce cas, on fait une copie de la liste). Voici un exemple :

my_list = [4, 5, 2, 0]
seq = [x for x in my_list]
print(seq)

qui donnera dans la console :

[4, 5, 2, 0]

Ici, on a copié my_list dans seq.

Application d’une expression

Une version plus complète de la syntaxe pour créer une liste par compréhension est :

[expression(variable) for variable in iterable]

Avec expression qui est une expression mathématique, contenant variable. Cette expression sera alors appliquée à tous les éléments issus de l’itérable.

Expression avec un range

Expression contenant une variable

En association avec la fonction range, cette syntaxe permet de produire une liste de valeurs ayant les caractéristiques que l’on souhaite. Voici quelques exemples :

  • [x*2 for x in range(10)] donnera [0, 2, 4, 6, 8, 10, 12, 14, 16, 18], soit la liste des nombre pairs ;
  • [x**2 for x in range(10)] donnera [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], soit la liste des nombre carrés ;
  • [x**2/100+3 for x in range(10)] donnera [3.0, 3.01, 3.04, 3.09, 3.16, 3.25, 3.36, 3.49, 3.64, 3.81].

Expression ne contenant pas de variable

Il est aussi possible d’écrire une expression mathématique ne contenant pas variable :

  • [7 for x in range(12)] donnera [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7], soit une liste de 12 nombres 7 ;
  • [randint(1, 100) for x in range(20)] donnera une liste de 20 valeurs aléatoires entre 1 et 100 (nécessite la ligne from random import randint au début du code pour fonctionner).

Expression avec une structure de données

Enfin, cette syntaxe permet de réaliser des opérations de traitement sur l’ensemble des éléments d’une liste, ce qui est très intéressant.

On peut, par exemple, convertir une série de données complète (ici on fait une conversion de vitesse, des km/h vers les m/s) :

speed_kmh = [15, 14.3, 18.6, 17.5]
speed_ms = [round(x/3.6,2) for x in speed_kmh]
print(speed_ms)

qui donnera dans la console :

[4.17, 3.97, 5.17, 4.86]

Application d’une condition

La version totale de la syntaxe pour créer une liste par compréhension est :

[expression(variable) for variable in iterable if condition(variable)]

Avec condition qui est une expression logique, contenant variable. Cette expression sera alors appliquée, comme un filtre, à tous les éléments issus iterable : seul les éléments validant cette condition seront conservés.

Condition sur un range

L’ajout d’une condition sur un range n’est pas forcément très intéressante, car les données produites par le range sont connues à l’avance et se suivent. Voici quand même quelques exemple :

  • [x for x in range(0,12) if x>7] qui donnera [8, 9, 10, 11] ;
  • [x for x in range(0,50) if x>25 and x<45] qui donnera [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44].

Condition sur une liste

Avec une liste au lieu d'un range, l’application d’une condition est très intéressante. Nous allons pouvoir réaliser en une seule ligne, des codes équivalents à des algorithmes parfois complexes. Voici quelques exemples :

Exemple 1

On peut filtrer tous les nombres d’une liste pour ne conserver que ceux plus petits qu’une certaine valeur :

init = [7, -5, 6, 7.2, 4.5, -1.5, 4, 3, -8, -1]
seq = [x for x in init if x<3]
print(seq)

qui donne dans la console :

[-5, -1.5, -8, -1]

Exemple 2

On peut filtrer tous les nombres d’une liste pour ne conserver que les nombres positifs :

init = [7, -5, 6, 7.2, 4.5, -1.5, 4, 3, -8, -1]
seq = [x for x in init if x>=0]
print(seq)

qui donne dans la console :

[7, 6, 7.2, 4.5, 4, 3]

Exemple 3

On peut filtrer tous les nombres d’une liste pour ne conserver que les nombres pairs :


init = [7, -5, 6, 7.2, 4.5, -1.5, 4, 3, -8, -1]
seq = [x for x in init if x%2==0]
print(seq)

qui donne dans la console :

[6, 4, -8]