L’issue s’ouvre déjà remplie avec le titre et l’adresse de cette page.
Vous avez une liste de 1000 utilisateurs et vous cherchez celui dont l'email est "alice.durand@laposte.net". Avec une liste classique, vous devez parcourir chaque élément un par un. Avec un dictionnaire, l'accès est instantané : users["alice.durand@laposte.net"].
Un dictionnaire Python (type dict) est une structure de données qui stocke des paires clé-valeur, créée avec des accolades : utilisateur = {'nom': 'Alice', 'age': 30}. Contrairement aux listes où vous accédez aux éléments par leur position (index 0, 1, 2...), les dictionnaires vous permettent d'accéder aux données par un nom significatif : utilisateur['nom']. C'est la structure idéale pour représenter des objets du monde réel : un utilisateur avec son nom, email et âge ; une configuration avec ses paramètres ; ou une réponse d'API au format JSON.
Ce guide vous accompagne de la création de votre premier dictionnaire jusqu'aux techniques avancées comme les compréhensions et les structures imbriquées.
Ce guide couvre l'essentiel des dictionnaires Python, de la création à l'utilisation avancée. Chaque section est accompagnée d'exemples concrets que vous pouvez copier et tester immédiatement.
À la fin de ce guide, vous saurez :
Créer des dictionnaires vides ou pré-remplis, la base pour stocker vos données structurées
Accéder aux valeurs de manière sécurisée avec get(), éviter les crashs sur des clés manquantes
Ajouter, modifier et supprimer des éléments, les opérations CRUD quotidiennes
Parcourir les clés, valeurs ou les deux ensemble, traiter vos données efficacement
Transformer des données avec les compréhensions de dictionnaire, écrire du code concis et pythonique
Gérer des structures imbriquées (dictionnaires dans des dictionnaires), manipuler des données JSON et API
Appliquer les bonnes pratiques pour un code robuste, éviter les pièges classiques
Un dictionnaire est une collection non ordonnée (depuis Python 3.7, l'ordre d'insertion est préservé) de paires clé-valeur. Chaque clé est unique et pointe vers une valeur.
Chaque dictionnaire se compose de trois éléments fondamentaux que vous manipulerez constamment :
Élément
Description
Exemple
Clé
Identifiant unique (immuable)
"nom", "age", 42
Valeur
Donnée associée (tout type)
"Alice", 30, [1, 2, 3]
Paire
Association clé → valeur
"nom": "Alice"
Glissez pour voir
La clé joue le rôle d'étiquette : elle doit être unique dans le dictionnaire (impossible d'avoir deux clés identiques) et immuable (les chaînes, nombres et tuples fonctionnent, mais pas les listes).
La valeur peut être de n'importe quel type Python : une chaîne, un nombre, une liste, un autre dictionnaire, ou même une fonction. Cette flexibilité fait des dictionnaires une structure de données extrêmement polyvalente.
La paire clé-valeur est la brique de base : vous écrivez clé: valeur séparées par deux-points, et chaque paire est séparée des autres par une virgule.
Les listes et les dictionnaires sont les deux structures de données les plus utilisées en Python. Comprendre leurs différences vous permet de choisir la bonne structure selon votre besoin :
Situation
Liste
Dictionnaire
Accéder par position
Oui : liste[0]
Non prévu pour ça
Accéder par nom/identifiant
Non : parcours nécessaire
Oui : dict["nom"]
Stocker des données hétérogènes nommées
Peu lisible
Idéal
Représenter un objet
Difficile
Naturel
Performance d'accès
O(n)
O(1) en moyenne
Glissez pour voir
Liste contre dictionnaire : dans la liste, liste[1] vaut 30 sans dire ce que 30 représente ; dans le dictionnaire, dict[age] vaut 30 et le nom de la clé explique la valeur.LISTE, accès par indexDICTIONNAIRE, accès par clé[0]"Alice"[1]30[2]"Paris"liste[1] = 30mais 30 représente quoi ?"nom""Alice""age"30"ville""Paris"dict["age"] = 30la clé explique la valeur
Concrètement, voici comment ces différences se manifestent dans le code :
Accès par position vs par nom : avec une liste ["Alice", 30, "Paris"], vous devez vous souvenir que l'index 1 correspond à l'âge. Avec un dictionnaire, utilisateur["age"] est explicite.
Performance : pour une liste de 10 000 éléments, trouver une valeur peut nécessiter de parcourir les 10 000 éléments (complexité O(n)). Un dictionnaire accède directement à la valeur via sa clé, quelle que soit la taille (complexité O(1)).
Données hétérogènes : un dictionnaire exprime naturellement qu'un utilisateur a un nom (texte), un âge (nombre) et un statut actif (booléen). Une liste mélange ces types sans contexte.
Le constructeur dict() crée un dictionnaire à partir d'arguments nommés, d'une liste de tuples, ou de deux séquences combinées avec zip(). Pratique quand les données viennent déjà sous forme de paires.
Les clés doivent être immuables (non modifiables). Pourquoi cette contrainte ? Python utilise un mécanisme appelé hachage pour retrouver instantanément une valeur à partir de sa clé. Si la clé pouvait changer après son insertion, Python ne saurait plus où retrouver la valeur associée.
Types immuables utilisables comme clés :
# Clés valides
valide = {
"texte": "valeur", # str - le plus courant
42: "valeur", # int - utile pour les ID numériques
3.14: "valeur", # float - rare mais possible
(1, 2): "valeur", # tuple - utile pour les coordonnées
True: "valeur"# bool - peu recommandé (collision avec 1)
}
Types mutables interdits :
# Clés invalides (TypeError: unhashable type)
# invalide = {
# [1, 2]: "valeur", # liste → utilisez un tuple (1, 2)
# {"a": 1}: "valeur" # dict → utilisez un tuple de tuples
# }
Cas pratique : coordonnées comme clés. Les tuples comme clés sont particulièrement utiles pour représenter des coordonnées ou des combinaisons :
L'accès direct par crochets renvoie la valeur associée à une clé. C'est la syntaxe la plus rapide, mais elle lève une KeyError si la clé est absente du dictionnaire.
utilisateur = {"nom": "Alice", "age": 30}
# Accès simple
nom = utilisateur["nom"]
print(nom) # Alice
# Erreur si la clé n'existe pas
# ville = utilisateur["ville"] # KeyError: 'ville'
Une fois le dictionnaire créé, vous ajoutez, modifiez ou supprimez des éléments à tout moment : un dictionnaire est mutable. Les opérations ci-dessous couvrent les cas les plus fréquents, de l'ajout d'une clé unique à la mise à jour groupée.
La méthode update() ajoute ou met à jour plusieurs clés en une seule opération, à partir d'un autre dictionnaire. Les clés déjà présentes sont écrasées.
La méthode pop() supprime une clé et retourne sa valeur, ce qui permet de la récupérer au passage. Un second argument sert de valeur de repli si la clé est absente, pour éviter la KeyError.
L'instruction del supprime une clé sans renvoyer sa valeur. Elle lève une KeyError si la clé n'existe pas : réservez-la aux cas où vous êtes sûr de sa présence.
La méthode popitem() retire et retourne la dernière paire insérée, sous forme de tuple (clé, valeur). Utile pour vider un dictionnaire comme une pile (dernier entré, premier sorti).
La méthode clear() retire toutes les clés d'un coup tout en conservant le même objet en mémoire. Les autres variables qui référencent ce dictionnaire voient donc aussi le vidage.
Contrairement aux listes où vous parcourez simplement les éléments dans l'ordre, un dictionnaire offre trois façons de le parcourir selon ce dont vous avez besoin : les clés seules, les valeurs seules, ou les deux ensemble, les paires. Choisir la bonne méthode rend votre code plus clair et plus efficace.
Les compréhensions permettent de créer des dictionnaires de manière concise et expressive. C'est l'une des fonctionnalités les plus élégantes de Python : une seule ligne remplace souvent 4-5 lignes de boucle.
La syntaxe suit le pattern {clé: valeur for élément in iterable}. Lisez-la de droite à gauche : "pour chaque élément dans l'iterable, crée une paire clé-valeur".
# Version longue avec boucle
carres = {}
for x inrange(1,6):
carres[x] = x**2
# Version compréhension (équivalente)
carres = {x: x**2for x inrange(1,6)}
print(carres) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Décomposition : {x: x**2 for x in range(1, 6)}
for x in range(1, 6) → parcourt les nombres 1, 2, 3, 4, 5
Une condition if placée en fin de compréhension agit comme un filtre : seuls les éléments qui la satisfont produisent une paire dans le dictionnaire final.
# Garder seulement les nombres pairs
carres_pairs = {x: x**2for x inrange(1,11) if x %2==0}
En échangeant k et v dans la compréhension, vous obtenez un dictionnaire inversé (les valeurs deviennent des clés). Attention : des valeurs en double provoqueraient des collisions de clés.
Les dictionnaires peuvent contenir d'autres dictionnaires, ce qui permet de représenter des structures imbriquées. C'est exactement ce que vous recevez quand vous interrogez une API REST ou lisez un fichier JSON.
La fusion de dictionnaires est une opération courante : combiner une configuration par défaut avec des options utilisateur, enrichir des données avec des informations complémentaires, ou consolider des résultats partiels.
Le dépaquetage ** rassemble plusieurs dictionnaires dans un nouveau dictionnaire, sans modifier les originaux. Compatible avec toutes les versions de Python 3.
base = {"nom": "Alice", "age": 30}
extra = {"ville": "Paris", "email": "alice.durand@laposte.net"}
Depuis Python 3.9, l'opérateur | fusionne deux dictionnaires en un nouveau, et |= réalise la fusion en place. C'est la syntaxe la plus lisible quand elle est disponible.
Voici les 10 méthodes que vous utiliserez le plus souvent. Gardez ce tableau sous le coude comme référence rapide :
Méthode
Description
Exemple
get(clé, défaut)
Accès sécurisé
d.get("x", 0)
keys()
Vue des clés
for k in d.keys()
values()
Vue des valeurs
for v in d.values()
items()
Vue des paires
for k, v in d.items()
pop(clé, défaut)
Supprime et retourne
d.pop("x", None)
popitem()
Supprime la dernière paire
d.popitem()
update(autre)
Fusionne
d.update({"a": 1})
setdefault(clé, val)
Ajoute si absent
d.setdefault("x", 0)
clear()
Vide le dict
d.clear()
copy()
Copie superficielle
d2 = d.copy()
Glissez pour voir
Les plus utilisées au quotidien :
get() : indispensable pour éviter les crashs quand vous traitez des données externes (API, fichiers JSON, formulaires). Toujours préférer d.get("clé", valeur_defaut) à d["clé"] quand la clé peut être absente.
items() : la méthode de parcours standard. Dans 90% des cas où vous parcourez un dictionnaire, vous avez besoin à la fois de la clé et de la valeur.
update() : parfait pour fusionner des configurations ou enrichir des données. Attention : les clés existantes sont écrasées par les nouvelles valeurs.
pop() : utile pour extraire une valeur tout en la supprimant du dictionnaire (pattern courant dans les files de traitement).
Ces recommandations viennent de l'expérience collective de la communauté Python. Elles vous éviteront des bugs subtils et rendront votre code plus facile à maintenir.
Les abréviations font gagner quelques caractères mais rendent le code obscur. Dans 6 mois, vous ne vous souviendrez plus ce que signifie "n" ou "a" : préférez des clés explicites.
# Peu lisible - économie de caractères mal placée
u = {"n": "Alice", "a": 30, "e": "alice.durand@laposte.net"}
# Clair et maintenable - le code se lit comme de la prose
Avec des données venues d'une API, d'un fichier ou d'un formulaire, une clé peut manquer sans que ce soit un bug. get() renvoie alors une valeur de repli plutôt que de faire planter le programme.
Supprimer ou ajouter des clés pendant l'itération change la taille du dictionnaire en cours de route et déclenche une RuntimeError. Itérez plutôt sur une copie des clés.
scores = {"Alice": 10, "Bob": 5, "Charlie": 15}
# Dangereux : RuntimeError possible
# for nom in scores:
# if scores[nom] < 10:
# del scores[nom]
# Créez une copie ou une liste des clés
for nom inlist(scores.keys()):
if scores[nom] <10:
del scores[nom]
4. Utilisez les compréhensions pour les transformations simples
Pour une transformation directe, une compréhension remplace une boucle de plusieurs lignes par une seule expression lisible. Réservez la boucle classique aux logiques complexes.
Au-delà de deux ou trois niveaux, un dictionnaire imbriqué devient difficile à lire et à maintenir. Une dataclass ou une structure aplatie exprime souvent mieux l'intention.
# Difficile à maintenir
data = {
"niveau1": {
"niveau2": {
"niveau3": {
"valeur": 42
}
}
}
}
# Envisagez des classes ou aplatissez la structure
Modifier la taille d'un dictionnaire pendant qu'on le parcourt lève une RuntimeError. La parade est simple : parcourez une copie des clés avec list(d.keys()).
Le troisième lab du fil rouge apprend à security_check.py le vrai rapport JSON
de Trivy, un dictionnaire imbriqué : la clé Results liste les cibles
analysées, et chacune range ses failles sous Vulnerabilities. Deux pièges de
dictionnaire l'attendent : une cible saine n'a pas cette clé du tout, et la
même faille répétée dans deux cibles ne doit compter qu'une fois, ce qu'une
clé de tuple règle. La validation joue un rapport réel de Trivy 0.74.0, 26
occurrences pour 22 failles distinctes, puis des rapports générés au hasard.
Si vous ne retenez que six règles de ce guide, retenez celles-ci. Elles couvrent l'essentiel des situations courantes que vous rencontrerez avec les dictionnaires :
Dictionnaire = paires clé-valeur, accès par nom, pas par position. Idéal pour représenter des objets.
Clés uniques et immuables, utilisez des strings, int, tuple. Jamais de listes ou dicts comme clés.
get() pour l'accès sécurisé, évite les KeyError quand la clé peut être absente.
items() pour parcourir, donne accès à la clé ET la valeur en même temps.
Compréhensions pour transformer, {k: v*2 for k, v in d.items()} est plus concis qu'une boucle.
Ne jamais modifier pendant le parcours, créez une copie des clés avec list(d.keys()).
Vérifiez que l'essentiel de ce guide est acquis. Les questions portent
uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
6 questions
6 min.
70% requis
Informations
Le chronomètre démarre au clic sur Démarrer
Questions à choix multiples, vrai/faux et réponses courtes
Vous pouvez naviguer entre les questions
Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
⏱️--:--
0 / 6
Vérification
(0/0)
--:--
0%
0Correctes
0À revoir
0:00Temps
-Niveau
Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.
Utilisez cette checklist pour valider votre maîtrise des dictionnaires. Cochez chaque point une fois que vous êtes capable de le faire sans consulter la documentation. Si un point vous bloque, revenez à la section correspondante du guide.
Les réponses courtes ci-dessous couvrent les questions les plus recherchées sur les dictionnaires Python. Chaque exemple est autonome et testé sur Python 3.12.
La façon la plus lisible est la syntaxe avec accolades, qui associe chaque clé à une valeur :
Plusieurs clés d'un coup avec update() : utilisateur.update({'age': 30, 'ville': 'Lyon'})
Ajouter seulement si absente avec setdefault() : utilisateur.setdefault('actif', True)
La méthode recommandée est items(), qui donne la clé et la valeur à chaque tour de boucle :
utilisateur = {'nom': 'Alice', 'age': 30}
for cle, valeur in utilisateur.items():
print(f"{cle} : {valeur}")
Selon le besoin :
Clés seules : for cle in utilisateur.keys() (ou for cle in utilisateur)
Valeurs seules : for valeur in utilisateur.values()
Ne modifiez jamais la taille du dictionnaire pendant que vous le parcourez : itérez sur une copie (list(utilisateur)) si vous devez supprimer des clés.
Il n'y a aucune différence : dict est le nom du type Python, et dictionnaire est le mot courant pour le concept. Les deux désignent la même structure clé-valeur.
mon_dict = {'a': 1}
print(type(mon_dict)) # <class 'dict'>
vide = dict() # dictionnaire vide, équivaut à {}
En pratique : on écrit dict pour le type et le constructeur, on dit dictionnaire en français pour parler de la structure.
Depuis Python 3.9, l'opérateur | crée un nouveau dictionnaire fusionné :