Listes définies “en compréhension”

Les listes peuvent être formées :

  • en évaluant l’expression list() ou []. On obtient la liste vide.
  • En combinant des éléments [elt0, elt1, …, eltn], ou en convertissant une séquence par list(seq).
  • en “compréhension”, par [expr for indice in iterable], ou [expr for indice in iterable if condition]. La liste est ici formée des valeurs de expr quand indice parcourt iterable (et où condition est facultative). Un “itérable” est tout objet qui peut être traversé, parcouru : (les séquences, les ensembles, les dictionnaires…)
    L’expression suivante forme par exemple la liste des {x^2} où 1 ≤ x < 100, en se limitant à x ≡ 3 modulo 10.

    En fait, les listes peuvent être construites “en compréhension” d’une façon plus générale encore.

La syntaxe est alors

Chacune des conditions est facultative (et la condition n˚i s’applique à l’indice n˚i).

Dans cette syntaxe, expression est évaluée en fonction des valeurs des {n}-uplets {(\mathrm{indice}_1,\mathrm{indice}_2,\ldots,\mathrm{indice}_n)} successifs (dans l’ordre lexicographique) et le résultat est la liste de ces évaluations de expression.

Il faut bien comprendre la chronologie : pour chacune des valeurs possibles de indice1 (définies par iterable1 et le test éventuel condition1), on fait varier indice2 (attention : iterable2 et condition2 peuvent dépendre de indice1), puis (à indice1 et indice2 fixés) on fait varier indice3, etc.

Ainsi la boucle sur indice1 “contient” la boucle sur indice2, qui contient elle-même, etc., jusqu’à la boucle sur indicen.

Voici deux premiers exemples où une liste est formée par compréhension avec deux for imbriqués. On voit que cela produit deux variables locales i et j, et que la première boucle “contient” la deuxième. Cette chronologie est importante, comme on le voit sur le troisième exemple, qui conduit à une erreur.

Voici quatre autres exemples, qui doivent être soigneusement comparés avec les précédents. Ici la liste calculée s’écrit [expression for indice in intervalle], où expression est elle-même définie comme une liste en compréhension. La boucle permettant de calculer expression est parcourue “sous le contrôle” de la boucle principale.

L’utilisation de listes en compréhension permet des constructions élégantes. L’imbrication des définitions en compréhension peut cependant conduire à des formulations assez délicates à relire, comme l’atteste cette fonction qui renvoie la liste des facteurs premiers strictement inférieurs à {n^2}, où n est l’entier passé en argument :

Retour à l’accueil du cours Python/Numpy

Sommaire du chapitre 5

  1. Propriétés communes aux séquences (hors “mutations”)
  2. Séquences mutables ou non
  3. Listes définies “en compréhension”
  4. Opérations de mutation de listes
  5. Les tuples
  6. Les chaînes de caractères
  7. Méthodes importantes sur les chaînes (split, join, format)
  8. Objets de type bytes et bytearray