Passer au contenu principal
eLearner.app
Module 6 · Leçon 1 sur 421/36 dans le cours~12 min
Leçons du module (1/4)

List comprehension

Une compréhension de liste (list comprehension) est une expression qui construit une liste en appliquant une transformation (et éventuellement un filtre) à un itérable. C'est la manière pythonique d'écrire for + append sur une seule ligne.

Python
# style impératif (verbeux)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# style pythonique
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

Syntaxe complète

Python
[espressione for elemento in iterabile if condizione]
  • expression : ce qu'il faut mettre dans la liste résultante
  • for element in iterable : boucle source
  • if condition (facultatif) : ne conserve que les éléments qui correspondent
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

if/else à l'intérieur de l'expression (ternaire)

Pour transformer de manière conditionnelle (plutôt que de filtrer), utilisez l'expression ternaire AVANT le for :

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

Multi-for : produit cartésien

Vous pouvez imbriquer plusieurs clauses for :

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

L'ordre des clauses for est "externe-avant-interne", comme s'il s'agissait de boucles imbriquées.

Quand ne pas utiliser une compréhension

  • Logique complexe avec de nombreuses branches if/else imbriquées → utilisez une boucle explicite.
  • Effets secondaires (print, écriture de fichiers) → boucle, pas de compréhension.
  • Plus de 2 niveaux imbriqués → une boucle explicite nommée est presque toujours préférable.

Compréhensions de listes imbriquées

Vous pouvez enchaîner plusieurs boucles for à l'intérieur d'une seule compréhension de liste. Par exemple, pour aplatir une matrice (une liste de listes) en une seule liste plate, vous pouvez écrire :

Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]

L'ordre des boucles reflète exactement l'ordre d'imbrication des boucles for traditionnelles.

À vous de jouer

Exercice#python.m6.l1.e1
Tentatives : 0Chargement…

Étant donné `nums = [1, 2, 3, 4, 5, 6]`, construisez `even_squares` avec les carrés des seuls nombres pairs. Évaluez `even_squares`.

Chargement de l'éditeur…
Afficher l'indice

if n % 2 == 0 à la fin.

Solution disponible après 3 tentatives

Exercice de révision

Exercice#python.m6.l1.e2
Tentatives : 0Chargement…

Étant donné `words = ['Ciao', 'Mondo', 'Python', 'Java']`, construisez `lengths` avec la longueur de CHAQUE mot, et `short_words` avec les seuls mots de moins de 5 caractères. Évaluez `(lengths, short_words)`.

Chargement de l'éditeur…
Afficher l'indice

Deux compréhensions distinctes.

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#python.m6.l1.e3
Tentatives : 0Chargement…

Utilisez une compréhension de liste pour calculer les carrés des seuls entiers pairs compris entre 1 et 10 inclusivement. Stockez la liste dans `even_squares` et évaluez-la.

Chargement de l'éditeur…
Afficher l'indice

Utilisez range(1, 11) pour itérer, if x % 2 == 0 pour filtrer, et x**2 comme expression.

Solution disponible après 3 tentatives