De la boucle Ă  l’expression one-liner

Vous Ă©crivez encore des boucles for Ă  rallonge pour construire vos listes en Python ? Vous avez croisĂ© ce genre de code et vous vous ĂȘtes demandĂ© comment ça marche ?

squares = [x**2 for x in range(10)]

Bienvenue dans le monde des listes en comprĂ©hension (ou list comprehensions en anglais). C’est l’une des fonctionnalitĂ©s les plus Ă©lĂ©gantes de Python, et la maĂźtriser va transformer votre façon d’Ă©crire du code. Dans ce tutoriel, on va voir ensemble, Ă©tape par Ă©tape, comment les utiliser, les combiner, et surtout
 ne pas en abuser.

1. Le problĂšme : la boucle classique

Imaginez que vous vouliez gĂ©nĂ©rer une liste des carrĂ©s des nombres de 0 Ă  9. La façon la plus naturelle quand on dĂ©bute, c’est une boucle for :

squares = []
for x in range(10):
    squares.append(x ** 2)

print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Ça fonctionne parfaitement. Mais c’est long Ă  Ă©crire, et surtout
 c’est bruyant. On a 4 lignes pour exprimer une idĂ©e simple.

Quand on lit ce code, le cerveau doit traiter la crĂ©ation de la liste vide, l’initialisation de la boucle, l’append, avant d’arriver au cƓur de l’intention : « je veux une liste de carrĂ©s ».

2. La solution : la liste en compréhension

Python nous offre une syntaxe plus concise et plus expressive :

squares = [x**2 for x in range(10)]
print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Une seule ligne. L’intention est immĂ©diate : « pour chaque x dans la sĂ©rie 0-9, mets xÂČ dans la liste ». C’est plus rapide Ă  Ă©crire, plus rapide Ă  lire, et mĂȘme lĂ©gĂšrement plus rapide Ă  exĂ©cuter.

La structure, décomposée

Une liste en comprĂ©hension suit toujours le mĂȘme schĂ©ma :

[expression for élément in itérable]
PartieRĂŽle
expressionCe qu’on met dans la liste (peut ĂȘtre n’importe quelle expression Python)
for élément in itérableLa boucle qui fournit les éléments

Exercice minute : Écrire une liste des cubes de 1 Ă  10. Essayez par vous-mĂȘme avant de lire la solution.

cubes = [x**3 for x in range(1, 11)]
print(cubes)  # [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

Facile, non ?

3. Filtrer avec if

Le vrai super-pouvoir des listes en comprĂ©hension, c’est la possibilitĂ© d’ajouter une condition de filtrage. Reprenons notre liste de carrĂ©s, mais cette fois on ne veut garder que les nombres pairs :

# Version boucle
even_squares = []
for x in range(10):
    if x % 2 == 0:
        even_squares.append(x ** 2)

# Version compréhension
even_squares = [x**2 for x in range(10) if x % 2 == 0]

print(even_squares)  # [0, 4, 16, 36, 64]

La syntaxe complĂšte devient :

[expression for élément in itérable if condition]

Le if se place aprĂšs la boucle, et avant la fin des crochets. Simple et logique.

Cas pratique : filtrer les mots d’une phrase

phrase = "Python est un langage de programmation formidable et puissant"
mots_long = [mot for mot in phrase.split() if len(mot) > 7]
print(mots_long)  # ['programmation', 'formidable', 'puissant']

En une ligne, on a splittĂ© la phrase, parcouru chaque mot, filtrĂ© ceux de plus de 7 lettres, et construit la liste. Essayez de faire ça en 4 lignes avec une boucle — c’est possible, mais moins Ă©lĂ©gant.

4. Les boucles imbriquées (et quand les utiliser)

On peut aussi avoir plusieurs for dans une mĂȘme comprĂ©hension. C’est l’Ă©quivalent d’une boucle imbriquĂ©e :

# Version boucle
pairs = []
for x in [1, 2, 3]:
    for y in [10, 20, 30]:
        pairs.append((x, y))

# Version compréhension
pairs = [(x, y) for x in [1, 2, 3] for y in [10, 20, 30]]

print(pairs)
# [(1, 10), (1, 20), (1, 30), (2, 10), (2, 20), (2, 30), (3, 10), (3, 20), (3, 30)]

⚠ Attention : DĂšs qu’on dĂ©passe deux boucles, une comprĂ©hension devient difficile Ă  lire. Dans ce cas, prĂ©fĂ©rez une boucle classique. La lisibilitĂ© prime toujours !

5. Compréhensions avec condition ternaire

On peut aussi utiliser un opĂ©rateur ternaire dans l’expression pour un traitement conditionnel :

# "pair" si pair, "impair" sinon
labels = ["pair" if x % 2 == 0 else "impair" for x in range(6)]
print(labels)  # ['pair', 'impair', 'pair', 'impair', 'pair', 'impair']

Attention Ă  ne pas confondre avec le if filtrant ! La rĂšgle est simple :

  • [x for x in liste if condition] → filtre les Ă©lĂ©ments
  • [vrai if condition else faux for x in liste] → transforme chaque Ă©lĂ©ment

6. Aller plus loin : dictionnaire et set en compréhension

Le mĂȘme principe existe pour les dictionnaires et les ensembles :

# Dictionnaire : {clé: valeur for élément in itérable}
carrés = {x: x**2 for x in range(5)}
print(carrés)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# Set (ensemble) : {expression for élément in itérable}
nombres = [1, 2, 2, 3, 3, 3, 4]
pairs_uniques = {x for x in nombres if x % 2 == 0}
print(pairs_uniques)  # {2, 4}

Les dictionnaires en compréhension sont particuliÚrement utiles pour transformer des données ou créer des index rapidement.

7. PiÚges à éviter

❌ Trop de complexitĂ©

Si votre compréhension tient sur 2-3 lignes, vous pouvez le faire, mais devriez-vous ?

# À ÉVITER — trop complexe
result = [[w.upper() for w in s.split() if len(w) > 3] for s in phrases if s.strip()]

# MIEUX — plus lisible
result = []
for s in phrases:
    if s.strip():
        mots = [w.upper() for w in s.split() if len(w) > 3]
        result.append(mots)

❌ NĂ©gliger la mĂ©moire

Une liste en comprĂ©hension construit toute la liste en mĂ©moire d’un coup. Pour des gros volumes, prĂ©fĂ©rez un gĂ©nĂ©rateur :

# Liste — tout en mĂ©moire
squares_list = [x**2 for x in range(1_000_000)]

# GĂ©nĂ©rateur — paresseux (Ă©valuĂ© Ă  la demande)
squares_gen = (x**2 for x in range(1_000_000))  # Notez les parenthĂšses !

❌ Effets de bord

Une comprĂ©hension est faite pour construire une liste, pas pour exĂ©cuter des actions avec effets de bord (comme print() ou Ă©crire dans un fichier). Si vous avez besoin d’effets de bord, utilisez une boucle for.

8. Exercice récapitulatif

Mettez en pratique tout ce que vous avez appris :

  1. Facile : Générez une liste des 10 premiers multiples de 3.
  2. Moyen : À partir d’une liste de tempĂ©ratures en Celsius, convertissez-les en Fahrenheit. Formule : F = C × 9/5 + 32.
  3. AvancĂ© : À partir d’une chaĂźne contenant des mots sĂ©parĂ©s par des espaces, crĂ©ez un dictionnaire qui associe chaque mot unique Ă  sa longueur.
Solutions (cliquez pour déplier)
# 1. Multiples de 3
[x * 3 for x in range(1, 11)]

# 2. Celsius vers Fahrenheit
celsius = [0, 10, 20, 30, 37, 100]
[c * 9/5 + 32 for c in celsius]
# Résultat : [32.0, 50.0, 68.0, 86.0, 98.6, 212.0]

# 3. Mot → longueur
phrase = "Python est un langage puissant et expressif"
{mot: len(mot) for mot in phrase.split()}
# Résultat : {'Python': 6, 'est': 3, 'un': 2, ...}

Ce qu’il faut retenir

  • ✅ Les listes en comprĂ©hension rendent le code plus concis et plus expressif
  • ✅ On peut filtrer avec if et transformer avec des expressions
  • ✅ Dictionnaires et sets ont leur propre syntaxe en comprĂ©hension
  • ✅ La lisibilitĂ© passe avant la concision — 2 boucles max, pas de logique trop complexe
  • ✅ Pour les grands volumes, pensez aux gĂ©nĂ©rateurs plutĂŽt qu’aux listes

MaĂźtriser les comprĂ©hensions, c’est adopter un style Pythonique qui fait la diffĂ©rence entre un code qui « marche » et un code qui se lit comme une phrase. C’est exactement le genre de compĂ©tence qu’on travaille et consolide dans nos formations pratiques.

Et vous ? Quelle est votre utilisation prĂ©fĂ©rĂ©e des listes en comprĂ©hension ? Un cas oĂč ça vous a sauvĂ© des lignes de code ? Racontez-nous en commentaire ! 👇


Photo de Myburgh Roux sur Pexels.

Envie d’aller plus loin ? DĂ©couvrez nos formations pratiques pour maĂźtriser Python et le dĂ©veloppement — avec un vrai formateur qui vous guide pas Ă  pas.