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.
# 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
[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
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 :
[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 :
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/elseimbriqué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 :
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
Étant donné `nums = [1, 2, 3, 4, 5, 6]`, construisez `even_squares` avec les carrés des seuls nombres pairs. Évaluez `even_squares`.
Afficher l'indice
if n % 2 == 0 à la fin.
Solution disponible après 3 tentatives
Exercice de révision
É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)`.
Afficher l'indice
Deux compréhensions distinctes.
Solution disponible après 3 tentatives
Défi supplémentaire
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.
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