Numérique et sciences informatiques (spécialité) · Première
Dictionnaires en Python : exercices corrigés de 1re NSI
Publié le 6 novembre 2026 · Mis à jour le 6 novembre 2026 · Signaler une erreur
L'essentiel
- Un dictionnaire relie chaque clé à une valeur ; on retrouve la valeur grâce à la clé, pas grâce à une position.1
- Les opérations de base : ajouter une association, lire la valeur d'une clé, tester la présence d'une clé, parcourir les données.2
- Écrire
d[c] = vcrée ou remplace l'association ; lire une clé absente provoque une erreur : teste avecinou utiliseget. - Pour compter ou regrouper, le schéma est toujours le même : partir d'un dictionnaire vide, parcourir les données, tester la clé, mettre à jour.
- Un dictionnaire qui représente un p-uplet nommé ne se modifie pas : on construit un nouveau dictionnaire.2
Comment utiliser ces exercices
Ces exercices te font manipuler des dictionnaires en Python, du plus simple (lire une valeur) au plus construit (regrouper des données, imbriquer des dictionnaires). Tu connais déjà les tableaux, les listes et les p-uplets nommés ; ici, on change la façon d'accéder aux données : par une clé et non par un indice.
Les exercices
Exercice 1 Lire un dictionnaire
On considère le dictionnaire suivant, qui associe à chaque matière la note d'un élève :
notes = {"maths": 14, "nsi": 17, "anglais": 12}
- Quelle est la valeur de
notes["nsi"]? - Quelles sont les clés de ce dictionnaire ?
- Que se passe-t-il si on exécute
notes["art"]? Comment l'éviter ?
Indice 1
On donne la clé entre crochets : la valeur associée est renvoyée.
Indice 2
La clé "art" ne figure pas dans le dictionnaire. Pense au test in.
Voir la correction pas à pas
notes["nsi"]renvoie la valeur associée à la clé"nsi": c'est 17.Les clés sont les chaînes
"maths","nsi"et"anglais". Les nombres 14, 17 et 12 sont les valeurs.La clé
"art"n'existe pas : Python lève une erreurKeyError. On l'évite avecif "art" in notes:avant la lecture, ou avecnotes.get("art", 0)qui renvoie 0 si la clé est absente.
Retiens que l'on lit toujours une valeur à partir de sa clé, et jamais l'inverse. Tester la présence d'une clé évite l'erreur quand on n'est pas sûr de son existence.
Exercice 2 Ajouter et modifier des associations
Le stock d'une épicerie est décrit par un dictionnaire :
stock = {"pommes": 12, "poires": 5}
On exécute dans l'ordre :
stock["poires"] = stock["poires"] + 8
stock["kiwis"] = 3
- Écris le dictionnaire obtenu.
- La première instruction ajoute-t-elle une clé ou modifie-t-elle une valeur ? Et la seconde ?
- Quel est le nombre total de fruits en stock après ces deux instructions ?
Indice 1
Avant l'affectation, regarde si la clé existe déjà dans le dictionnaire.
Indice 2
Pour le total, additionne toutes les valeurs, pas les clés.
Voir la correction pas à pas
Avant la première instruction,
stock["poires"]vaut 5. Le membre de droite calcule 5 + 8 = 13, et cette valeur est rangée sous la clé"poires".La seconde instruction range 3 sous la clé
"kiwis", qui n'existait pas encore.Dictionnaire obtenu :
{"pommes": 12, "poires": 13, "kiwis": 3}.La première instruction modifie la valeur d'une clé existante ; la seconde ajoute une nouvelle association. La syntaxe est la même
d[cle] = valeur, c'est l'état du dictionnaire qui décide du résultat.Total : 12 + 13 + 3 = 28 fruits.
Avec d[cle] = valeur, tu ajoutes si la clé est nouvelle et tu remplaces si elle existe déjà. C'est pratique, mais ça demande de savoir ce que contient le dictionnaire avant l'instruction.
Exercice 3 Parcourir pour calculer un total
Deux dictionnaires décrivent une commande de fournitures :
prix = {"stylo": 1.5, "cahier": 3, "regle": 2}
quantites = {"stylo": 4, "cahier": 2, "regle": 1}
- Écris une fonction
total(prix, quantites)qui renvoie le montant de la commande. - Calcule à la main le résultat pour ces données.
- Que se passe-t-il si
quantitescontient une clé absente deprix? Propose une protection.
Indice 1
Parcours les clés de quantites et utilise chaque clé pour lire les deux dictionnaires.
Indice 2
Un accumulateur initialisé à 0 reçoit prix × quantité à chaque tour.
Voir la correction pas à pas
On initialise un accumulateur :
somme = 0.On parcourt les clés de
quantites:for article in quantites:.À chaque tour, on ajoute
prix[article] * quantites[article]àsomme. La même clé sert à lire dans les deux dictionnaires.On renvoie
sommeaprès la boucle. Fonction complète :def total(prix, quantites): somme = 0 for article in quantites: somme = somme + prix[article] * quantites[article] return sommeCalcul : 1,5 × 4 + 3 × 2 + 2 × 1 = 6 + 6 + 2 = 14.
Si un article de
quantitesmanque dansprix,prix[article]lève une erreur. Protection :if article in prix:avant le calcul, ou bienprix.get(article, 0).
Parcourir les clés d'un dictionnaire et s'en servir pour lire dans un autre dictionnaire est un schéma très fréquent. L'ordre des clés ne change pas le total ici, car une somme ne dépend pas de l'ordre.
Exercice 4 Compter les occurrences des lettres
Écris une fonction compter(mot) qui renvoie un dictionnaire associant à chaque lettre du mot son nombre d'apparitions.
- Écris la fonction.
- Donne le dictionnaire renvoyé par
compter("abracadabra"). - Combien de fois la lettre
"a"apparaît-elle ?
Indice 1
Pars d'un dictionnaire vide et parcours les lettres du mot.
Indice 2
Deux cas à traiter : la lettre est déjà une clé, ou elle ne l'est pas encore.
Voir la correction pas à pas
On crée le dictionnaire vide :
effectifs = {}.On parcourt le mot lettre par lettre.
Si la lettre est déjà une clé, on augmente sa valeur de 1. Sinon, on crée l'association avec la valeur 1.
Fonction complète :
def compter(mot): effectifs = {} for lettre in mot: if lettre in effectifs: effectifs[lettre] = effectifs[lettre] + 1 else: effectifs[lettre] = 1 return effectifsPour
"abracadabra":{"a": 5, "b": 2, "r": 2, "c": 1, "d": 1}. Les lettres apparaissent dans l'ordre de leur première rencontre.La lettre
"a"apparaît 5 fois. Contrôle : a-b-r-a-c-a-d-a-b-r-a donne bien 5 occurrences, et 5 + 2 + 2 + 1 + 1 = 11 correspond à la longueur du mot.
Le comptage suit toujours le même schéma : dictionnaire vide, parcours, test de présence, mise à jour. Vérifier que la somme des valeurs égale la longueur du mot est un bon contrôle.
Exercice 5 Regrouper des élèves par classe
Un dictionnaire associe à chaque élève sa classe :
eleves = {"Lea": "1G1", "Tom": "1G2", "Ines": "1G1", "Paul": "1G2", "Sam": "1G1"}
On veut le dictionnaire inverse, qui associe à chaque classe la liste de ses élèves.
- Écris le résultat attendu pour ces données.
- Écris une fonction
par_classe(eleves)qui construit ce dictionnaire. - Pourquoi ne peut-on pas simplement échanger clés et valeurs ?
Indice 1
Les valeurs du nouveau dictionnaire sont des listes : il faut en créer une quand la classe apparaît pour la première fois.
Indice 2
Pense à ce qui arrive quand deux élèves ont la même classe.
Voir la correction pas à pas
Résultat attendu :
{"1G1": ["Lea", "Ines", "Sam"], "1G2": ["Tom", "Paul"]}.On part de
groupes = {}.On parcourt les élèves :
for nom in eleves:, et on lit sa classe :classe = eleves[nom].Si la classe n'est pas encore une clé de
groupes, on lui associe une liste vide. Puis on ajoute le nom à la liste :def par_classe(eleves): groupes = {} for nom in eleves: classe = eleves[nom] if classe not in groupes: groupes[classe] = [] groupes[classe].append(nom) return groupesÉchanger simplement clés et valeurs ne marche pas : plusieurs élèves partagent la même classe. On aurait donc plusieurs associations pour une même nouvelle clé, et chacune écraserait la précédente. La liste permet de conserver tous les élèves.
Quand plusieurs éléments partagent une même clé, la valeur doit être un conteneur (une liste ici). Le schéma « créer si absent, puis compléter » est celui du comptage, avec une liste à la place d'un nombre.
Exercice 6 Dictionnaire imbriqué et p-uplet nommé
Chaque élève est représenté par un dictionnaire de notes, rangé dans un dictionnaire général :
classe = {
"Lea": {"maths": 15, "nsi": 18},
"Tom": {"maths": 9, "nsi": 12},
"Ines": {"maths": 13, "nsi": 15},
}
- Que vaut
classe["Tom"]["nsi"]? - Écris une fonction
moyenne(classe, matiere)qui renvoie la moyenne de la classe dans une matière. - Calcule la moyenne en NSI.
- Ces dictionnaires internes jouent le rôle de p-uplets nommés. Écris une fonction
bonus(eleve, points)qui renvoie l'élève avec des points de bonus en NSI, sans modifier le dictionnaire reçu.
Indice 1
classe["Tom"] est lui-même un dictionnaire : on peut le lire avec une seconde clé.
Indice 2
Pour ne pas modifier l'original, construis un nouveau dictionnaire avec les mêmes associations, sauf pour "nsi".
Voir la correction pas à pas
classe["Tom"]est le dictionnaire{"maths": 9, "nsi": 12}, et["nsi"]en extrait 12.Pour la moyenne, on parcourt les élèves, on cumule
classe[nom][matiere], puis on divise par le nombre d'élèves :def moyenne(classe, matiere): somme = 0 for nom in classe: somme = somme + classe[nom][matiere] return somme / len(classe)En NSI : (18 + 12 + 15) / 3 = 45 / 3 = 15.
Pour
bonus, on construit un nouveau dictionnaire au lieu de changer l'ancien :def bonus(eleve, points): nouveau = {} for matiere in eleve: nouveau[matiere] = eleve[matiere] nouveau["nsi"] = eleve["nsi"] + points return nouveauOn suit ainsi la prudence indiquée par la ressource Éduscol : ne pas toucher aux dictionnaires qui représentent des p-uplets.2 L'appel
bonus(classe["Tom"], 2)renvoie{"maths": 9, "nsi": 14}et laisseclasse["Tom"]intact.
Un dictionnaire peut contenir d'autres dictionnaires : on enchaîne alors les clés. Et quand un dictionnaire représente un enregistrement, on préfère en fabriquer un nouveau plutôt que de l'altérer, ce qui évite des modifications involontaires ailleurs dans le programme.
Exercice 7 Table de correspondance et valeur par défaut
Un petit programme code des couleurs en nombres grâce à ce dictionnaire :
code = {"rouge": 1, "vert": 2, "bleu": 3}
- Écris une fonction
encoder(liste)qui renvoie la liste des codes d'une liste de couleurs, en utilisant 0 pour une couleur inconnue. - Que renvoie
encoder(["bleu", "jaune", "rouge"])? - Écris la fonction
decoder(n)qui renvoie le nom de la couleur de coden, ouNonesi aucune ne correspond.
Indice 1
code.get(couleur, 0) évite l'erreur sur une clé absente.
Indice 2
Pour décoder, on cherche la clé dont la valeur vaut n : parcours les clés.
Voir la correction pas à pas
On crée une liste vide
resultat = [].On parcourt
listeet, pour chaque couleur, on ajoutecode.get(couleur, 0): c'est la valeur associée si la clé existe, sinon 0.Fonction :
def encoder(liste): resultat = [] for couleur in liste: resultat.append(code.get(couleur, 0)) return resultatencoder(["bleu", "jaune", "rouge"])renvoie[3, 0, 1]:"jaune"n'est pas une clé, d'où le 0.Pour
decoder, on ne peut pas lire directement par la valeur. On parcourt les clés et on compare :def decoder(n): for couleur in code: if code[couleur] == n: return couleur return NoneCette recherche par valeur oblige à parcourir le dictionnaire, alors que la recherche par clé est directe : c'est pour cela qu'on choisit comme clé ce par quoi on cherche le plus souvent.
Un dictionnaire est fait pour aller d'une clé vers une valeur. Dans l'autre sens, il faut parcourir. Choisis donc les clés selon la recherche que tu feras le plus souvent.
Les questions qu'on se pose
Quelle différence entre un dictionnaire et une liste en Python ?
Dans une liste, tu retrouves un élément par sa position (l'indice). Dans un dictionnaire, tu le retrouves par sa clé, qui peut être un mot, un nombre ou autre chose.1 Choisis la liste quand l'ordre ou la position compte, et le dictionnaire quand tu veux retrouver une information à partir d'un identifiant, comme une note à partir d'une matière.
Que faire quand une clé n'existe pas dans le dictionnaire ?
Lire d[cle] avec une clé absente provoque une erreur KeyError. Deux solutions : tester d'abord avec if cle in d:, ou lire avec d.get(cle, defaut), qui renvoie la valeur par défaut que tu choisis. Pour les comptages, on teste la présence : si la clé manque, on la crée avec la valeur initiale, sinon on met à jour la valeur existante.
Comment recopier un dictionnaire sans modifier l'original ?
Écrire b = a ne crée pas de copie : les deux noms désignent le même dictionnaire, et modifier l'un modifie l'autre. Pour une vraie copie, tu construis un nouveau dictionnaire en recopiant chaque association (boucle sur les clés), comme dans la fonction bonus de l'exercice sur les dictionnaires imbriqués. Cette précaution rejoint celle que la ressource Éduscol conseille pour les dictionnaires qui représentent des p-uplets.2
Sources
- Ressource Éduscol NSI — Dictionnaires et types construits, Éduscol. Consulté le 6 novembre 2026.
- Ressource Éduscol NSI — Structure de données dictionnaire, Éduscol. Consulté le 6 novembre 2026.
- Dictionnaire, Wikipédia. Consulté le 6 novembre 2026.
- Dictionnaire historique de la Suisse, Wikipédia. Consulté le 6 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.