Aller au contenu

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] = v crée ou remplace l'association ; lire une clé absente provoque une erreur : teste avec in ou utilise get.
  • 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

★☆☆Environ 5 min

On considère le dictionnaire suivant, qui associe à chaque matière la note d'un élève :

notes = {"maths": 14, "nsi": 17, "anglais": 12}
  1. Quelle est la valeur de notes["nsi"] ?
  2. Quelles sont les clés de ce dictionnaire ?
  3. 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
  1. notes["nsi"] renvoie la valeur associée à la clé "nsi" : c'est 17.

  2. Les clés sont les chaînes "maths", "nsi" et "anglais". Les nombres 14, 17 et 12 sont les valeurs.

  3. La clé "art" n'existe pas : Python lève une erreur KeyError. On l'évite avec if "art" in notes: avant la lecture, ou avec notes.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

★☆☆Environ 8 min

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
  1. Écris le dictionnaire obtenu.
  2. La première instruction ajoute-t-elle une clé ou modifie-t-elle une valeur ? Et la seconde ?
  3. 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
  1. 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".

  2. La seconde instruction range 3 sous la clé "kiwis", qui n'existait pas encore.

  3. Dictionnaire obtenu : {"pommes": 12, "poires": 13, "kiwis": 3}.

  4. 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.

  5. 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

★★☆Environ 12 min

Deux dictionnaires décrivent une commande de fournitures :

prix = {"stylo": 1.5, "cahier": 3, "regle": 2}
quantites = {"stylo": 4, "cahier": 2, "regle": 1}
  1. Écris une fonction total(prix, quantites) qui renvoie le montant de la commande.
  2. Calcule à la main le résultat pour ces données.
  3. Que se passe-t-il si quantites contient une clé absente de prix ? 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
  1. On initialise un accumulateur : somme = 0.

  2. On parcourt les clés de quantites : for article in quantites:.

  3. À chaque tour, on ajoute prix[article] * quantites[article] à somme. La même clé sert à lire dans les deux dictionnaires.

  4. On renvoie somme après la boucle. Fonction complète :

    def total(prix, quantites):
        somme = 0
        for article in quantites:
            somme = somme + prix[article] * quantites[article]
        return somme
    
  5. Calcul : 1,5 × 4 + 3 × 2 + 2 × 1 = 6 + 6 + 2 = 14.

  6. Si un article de quantites manque dans prix, prix[article] lève une erreur. Protection : if article in prix: avant le calcul, ou bien prix.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

★★☆Environ 15 min

Écris une fonction compter(mot) qui renvoie un dictionnaire associant à chaque lettre du mot son nombre d'apparitions.

  1. Écris la fonction.
  2. Donne le dictionnaire renvoyé par compter("abracadabra").
  3. 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
  1. On crée le dictionnaire vide : effectifs = {}.

  2. On parcourt le mot lettre par lettre.

  3. Si la lettre est déjà une clé, on augmente sa valeur de 1. Sinon, on crée l'association avec la valeur 1.

  4. 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 effectifs
    
  5. Pour "abracadabra" : {"a": 5, "b": 2, "r": 2, "c": 1, "d": 1}. Les lettres apparaissent dans l'ordre de leur première rencontre.

  6. 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

★★★Environ 15 min

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.

  1. Écris le résultat attendu pour ces données.
  2. Écris une fonction par_classe(eleves) qui construit ce dictionnaire.
  3. 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
  1. Résultat attendu : {"1G1": ["Lea", "Ines", "Sam"], "1G2": ["Tom", "Paul"]}.

  2. On part de groupes = {}.

  3. On parcourt les élèves : for nom in eleves:, et on lit sa classe : classe = eleves[nom].

  4. 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
    
  5. É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é

★★★Environ 20 min

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},
}
  1. Que vaut classe["Tom"]["nsi"] ?
  2. Écris une fonction moyenne(classe, matiere) qui renvoie la moyenne de la classe dans une matière.
  3. Calcule la moyenne en NSI.
  4. 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
  1. classe["Tom"] est le dictionnaire {"maths": 9, "nsi": 12}, et ["nsi"] en extrait 12.

  2. 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)
    
  3. En NSI : (18 + 12 + 15) / 3 = 45 / 3 = 15.

  4. 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 nouveau
    
  5. On 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 laisse classe["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

★★☆Environ 12 min

Un petit programme code des couleurs en nombres grâce à ce dictionnaire :

code = {"rouge": 1, "vert": 2, "bleu": 3}
  1. Écris une fonction encoder(liste) qui renvoie la liste des codes d'une liste de couleurs, en utilisant 0 pour une couleur inconnue.
  2. Que renvoie encoder(["bleu", "jaune", "rouge"]) ?
  3. Écris la fonction decoder(n) qui renvoie le nom de la couleur de code n, ou None si 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
  1. On crée une liste vide resultat = [].

  2. On parcourt liste et, pour chaque couleur, on ajoute code.get(couleur, 0) : c'est la valeur associée si la clé existe, sinon 0.

  3. Fonction :

    def encoder(liste):
        resultat = []
        for couleur in liste:
            resultat.append(code.get(couleur, 0))
        return resultat
    
  4. encoder(["bleu", "jaune", "rouge"]) renvoie [3, 0, 1] : "jaune" n'est pas une clé, d'où le 0.

  5. 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 None
    
  6. Cette 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

  1. Ressource Éduscol NSI — Dictionnaires et types construits, Éduscol. Consulté le 6 novembre 2026.
  2. Ressource Éduscol NSI — Structure de données dictionnaire, Éduscol. Consulté le 6 novembre 2026.
  3. Dictionnaire, Wikipédia. Consulté le 6 novembre 2026.
  4. 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.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page