Prépa Python

Avancé — chapitre 29 sur 54

Les compréhensions

Liste, dict, set et expressions génératrices — le Python idiomatique

70 minAbonnés

Les compréhensions sont probablement la construction la plus emblématique de Python. Elles permettent d'écrire en une ligne ce qui demanderait 4 ou 5 lignes avec une boucle classique. Maîtrisées au TOSA Avancé, elles font la différence entre un débutant et un Pythoniste.

Le principe

Vous avez déjà utilisé ce pattern dans la Partie 2, sans qu'on le nomme :

python
# Pattern classique : boucle + append
notes = [12, 15, 9, 17, 11]

carres = []
for n in notes:
    carres.append(n ** 2)

print(carres)

La compréhension de liste exprime la même chose en une ligne :

python
notes = [12, 15, 9, 17, 11]
carres = [n ** 2 for n in notes]
print(carres)

C'est plus court, plus lisible, et plus rapide (optimisations internes de Python).

Anatomie d'une compréhension

text
[ expression  for element in iterable  if condition ]
  └────┬────┘ └────────┬──────────┘  └─────┬──────┘
   transforme   parcourt chaque         filtre

Les trois parties :

  1. expression : ce qu'on produit pour chaque élément retenu.
  2. for element in iterable : d'où viennent les éléments.
  3. if condition (optionnelle) : garde seulement les éléments vérifiant la condition.

Compréhensions de liste

Forme basique : transformer

python
nombres = [1, 2, 3, 4, 5]

# Doubler
doubles = [n * 2 for n in nombres]
print(doubles)

# Carrés
carres = [n ** 2 for n in nombres]
print(carres)

# Conversion de types
chaines = [str(n) for n in nombres]
print(chaines)

Avec filtrage : if

python
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Seulement les pairs
pairs = [n for n in nombres if n % 2 == 0]
print(pairs)

# Pairs multipliés par 10
pairs_x10 = [n * 10 for n in nombres if n % 2 == 0]
print(pairs_x10)

# Chaînes non vides
mots = ["Alice", "", "Bob", "  ", "Charlie"]
non_vides = [m for m in mots if m.strip()]
print(non_vides)

Avec expression conditionnelle (ternaire)

On peut placer une ternaire dans l'expression (attention, ce n'est plus un filtre !) :

python
notes = [12, 15, 9, 17, 7, 11]

# Étiqueter chaque note
mentions = ["admis" if n >= 10 else "recalé" for n in notes]
print(mentions)

Compréhensions imbriquées (2 for)

On peut chaîner plusieurs for pour produire toutes les combinaisons :

python
# Produit cartésien
couleurs = ["rouge", "vert"]
tailles = ["S", "M", "L"]

combinaisons = [f"{c}-{t}" for c in couleurs for t in tailles]
print(combinaisons)

Équivalent à deux boucles imbriquées :

python
combinaisons = []
for c in couleurs:
    for t in tailles:
        combinaisons.append(f"{c}-{t}")

Aplatir une liste de listes

Un idiome classique :

python
matrice = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

aplatie = [x for ligne in matrice for x in ligne]
print(aplatie)

Suite réservée aux abonnés

Débloquez l'intégralité du parcours

Les 54 chapitres, les exercices corrigés automatiquement, les examens blancs et le suivi de votre progression.

Voir les offresChapitres en accès libre

Déjà un accès ? Connectez-vous.