List comprehension Python : syntaxe, exemples et cas à éviter
Apprenez la list comprehension Python pas à pas : créez, filtrez et transformez des listes en une ligne, découvrez des temps mesurés face aux boucles et sachez quand une boucle for reste plus lisible.
- Le modèle est
[expression for élément in itérable if condition]. - Un simple
ifà la fin filtre ; unif-elseau début choisit entre deux valeurs. - Dans notre test, la compréhension a été environ 37 % plus rapide qu’une boucle avec
append. - Passez à une expression génératrice pour de très gros volumes, et à une boucle classique quand la logique demande plusieurs étapes claires.
Une list comprehension Python construit une nouvelle liste à partir de n’importe quel itérable en une seule ligne lisible. Au lieu de créer une liste vide, de la parcourir et d’appeler append, vous décrivez le résultat voulu.
Ce guide va du modèle de base aux filtres, aux boucles imbriquées et aux temps que nous avons mesurés nous-mêmes. Si Python est nouveau pour vous, commencez par notre tutoriel Python pour débutants (en anglais) et gardez un environnement propre avec le guide des environnements virtuels (en anglais).
Syntaxe de la list comprehension Python
Lisez-la de gauche à droite : l’expression indique l’aspect de chaque nouvel élément, la partie for indique d’où viennent les éléments.
squares = [x * x for x in range(6)]
print(squares) # [0, 1, 4, 9, 16, 25]
names = [" Hi ", " QA "]
clean = [n.strip().lower() for n in names]
print(clean) # ['hi', 'qa']
Le même résultat avec une boucle demande trois lignes de plus. Ce gain est tout l’intérêt, tant que la ligne reste facile à lire.
Filtrer les éléments avec une condition
Ajoutez un if après la boucle pour ne garder que les éléments qui passent la condition.
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
List comprehension Python avec if-else
Quand vous voulez une valeur pour chaque élément, placez le if-else avant le for. C’est ce qui piège le plus les débutants, car un else en fin de ligne est une erreur de syntaxe.
labels = ["even" if x % 2 == 0 else "odd" for x in range(4)]
print(labels) # ['even', 'odd', 'even', 'odd']
Règle simple : un if à la fin retire des éléments, un if-else au début les transforme. Avec if-else, la longueur de la liste ne change pas.
Boucles imbriquées et aplatissement
Plusieurs clauses for se lisent dans le même ordre que des boucles imbriquées. Utilisez-les pour aplatir une liste de listes ou former des paires.
matrix = [[1, 2, 3], [4, 5, 6]]
flat = [n for row in matrix for n in row]
print(flat) # [1, 2, 3, 4, 5, 6]
pairs = [(x, y) for x in range(1, 3) for y in "ab"]
print(pairs) # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
Pour transposer la matrice, imbriquez une compréhension dans une autre : [[r[i] for r in matrix] for i in range(3)] donne [[1, 4], [2, 5], [3, 6]]. Deux niveaux sont la limite pratique avant que la lisibilité ne chute.
Formes dictionnaire, ensemble et générateur
Changez les délimiteurs et la même idée produit d’autres types.
lengths = {w: len(w) for w in ["pip", "venv", "uv"]} # {'pip': 3, 'venv': 4, 'uv': 2}
unique = {len(w) for w in ["pip", "venv", "uv", "git"]} # {2, 3, 4}
total = sum(x * x for x in range(1_000_000)) # generator, no list
Comparez les types eux-mêmes dans notre guide sur les listes, tuples, ensembles et dictionnaires (en anglais).
Vitesse et mémoire : ce que nous avons mesuré
Nous avons chronométré chaque version sous Python 3.13.6 avec 100 000 entiers, en retenant le meilleur de cinq essais. Vos chiffres différeront, mais l’ordre reste stable.
| Tâche | Durée |
|---|---|
Boucle avec append (doubler chaque élément) | 5,18 ms |
| List comprehension (doubler chaque élément) | 3,25 ms |
list(map(lambda ...)) | 6,50 ms |
| Filtrer les pairs avec une boucle | 3,62 ms |
| Filtrer les pairs avec une compréhension | 3,43 ms |
La compréhension bat nettement la boucle avec append, mais l’écart se réduit quand l’essentiel du temps est passé dans la condition. Côté mémoire, une liste d’un million d’entiers doublés a pris environ 8,4 Mo, alors que le générateur équivalent ne pesait que 200 octets, car il produit les valeurs une à une.
Quand ne pas utiliser une list comprehension
- Vous n’avez besoin que d’effets de bord, comme afficher ou enregistrer. Utilisez une boucle classique : une compréhension construirait une liste inutile.
- La logique comporte plusieurs étapes. Si vous avez besoin d’une seconde variable ou d’un
try, écrivez une boucle ou une petite fonction. - Les données sont énormes. Utilisez une expression génératrice pour que Python ne garde pas toute la liste en mémoire.
- Elle demande plus de deux clauses
for. Découpez-la en étapes nommées pour le prochain lecteur.
Pour conclure
Utilisez une list comprehension Python quand une ligne courte dit exactement ce que vous voulez, et une boucle quand ce n’est pas le cas. Commencez par le modèle de base, ajoutez un filtre, puis exercez-vous à la forme if-else jusqu’à ce que l’ordre devienne naturel.
Questions fréquentes
Qu’est-ce qu’une list comprehension en Python ?
C’est une façon compacte de créer une liste en appliquant une expression à chaque élément d’un itérable, avec une condition facultative pour filtrer.
Comment utiliser if-else dans une list comprehension ?
Placez l’expression conditionnelle avant la clause for, par exemple ["even" if x % 2 == 0 else "odd" for x in nums]. Un simple filtre utilise un seul if après la boucle.
Une list comprehension est-elle plus rapide qu’une boucle for ?
En général oui. Dans notre test sur 100 000 éléments, elle a été environ 37 % plus rapide qu’une boucle avec append, mais la lisibilité doit passer en premier.
Quelle différence entre une list comprehension et une expression génératrice ?
La list comprehension construit toute la liste en mémoire d’un coup. L’expression génératrice utilise des parenthèses et produit une valeur à la fois, ce qui économise la mémoire sur de gros volumes.
Peut-on imbriquer des list comprehensions ?
Oui, pour aplatir ou transposer une matrice. Limitez-vous à deux niveaux et passez à une boucle si la lecture devient difficile.
Pour aller plus loin (articles en anglais)
Besoin d’aide pour les tests, WordPress ou le SEO ?
Nous aidons les équipes à livrer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous proposerons la prochaine étape.
Plus de guides sur tests, IA et développement moderne
Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.
Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire
Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …
Lire l'article →DevOpsVariables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués
Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…
Lire l'article →Développement logicielLimitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429
Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…
Lire l'article →Automatisation des testsSe moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests
Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…
Lire l'article →Tests logicielsCouverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %
Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…
Lire l'article →Bases de données et SQLDELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser
DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …
Lire l'article →Bases de données et SQLVues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples
Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …
Lire l'article →Développement logicielInterface TypeScript vs Type : différences réelles, testées avec le compilateur
Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…
Lire l'article →Développement logicielPython *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs
Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…
Lire l'article →Développement logicielFonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser
Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…
Lire l'article →Intelligence artificielleQue sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter
Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…
Lire l'article →DevOpsSurveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces
Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…
Lire l'article →DevOpsVolumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière
Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…
Lire l'article →Automatisation des testsTDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser
TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…
Lire l'article →Développement logicielGit merge vs rebase : différences, exemples et quand utiliser chacun
Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.
Lire l'article →Développement logicielList comprehension Python : syntaxe, exemples et cas à éviter
La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…
Lire l'article →Bases de données et SQLJointures SQL expliquées avec exemples (Inner, Left, Right, Full)
Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…
Lire l'article →