Les dictionnaires
Cours · NSI (première), chapitre 5 · première, spécialité numérique et sciences informatiques · le début du chapitre, la suite sur Adloun
Le tableau du chapitre précédent repère ses éléments par un entier : le premier, le deuxième, le millième. C'est commode quand la position a un sens — les pixels d'une ligne, les termes d'une suite. Mais bien des données ne se rangent pas ainsi. L'âge d'un élève n'est pas « le troisième âge » : c'est l'âge de Nour. Le nombre d'occurrences de la lettre e n'est pas à la case 4 : il est à la case "e".
Le dictionnaire répond exactement à ce besoin : repérer une valeur non par un rang, mais par une autre valeur.
5.1 Clés et valeurs
Un dictionnaire est une collection de couples dans laquelle chaque clé apparaît au plus une fois, et donne accès à la valeur qui lui est associée. On le note entre accolades, les couples séparés par des virgules et écrits clé : valeur.
ages = {"Nour": 17, "Camille": 16, "Yanis": 17}
ages["Nour"] # 17 : accès par la CLÉ, pas par un rang
len(ages) # 3 : nombre de couples
Deux remarques immédiates, et les deux comptent :
- les clés sont uniques, les valeurs non. Ici, deux élèves ont 17 ans : la valeur apparaît deux fois, mais
"Nour"n'apparaît qu'une. - il n'y a pas d'ordre à exploiter. On ne demande pas « le deuxième élément » d'un dictionnaire : la question n'a pas de sens dans la structure.
Depuis Python 3.7, un dictionnaire restitue ses couples dans l'ordre où ils ont été insérés. C'est une commodité de Python, pas une propriété des dictionnaires : dans d'autres langages, et dans la notion elle-même, l'ordre est arbitraire. N'écrivez jamais un programme dont la correction dépend de cet ordre — il n'aurait de sens que sur Python, et il en dépendrait sans le dire.
5.2 Construire, lire, modifier
Capacité attendue
« Construire une entrée de dictionnaire. »
ages = {} # dictionnaire vide
ages["Nour"] = 17 # création d'une entrée
ages["Camille"] = 16
ages["Nour"] = 18 # la MÊME clé : la valeur est remplacée, pas ajoutée
"Nour" in ages # True : test d'appartenance, porte sur les CLÉS
"Yanis" in ages # False
del ages["Camille"] # suppression d'une entrée
ages["Nour"] = 18 crée l'entrée si la clé est absente, et remplace la valeur si elle est présente. Rien ne distingue les deux cas à l'écriture — c'est commode, et c'est dangereux : une faute de frappe dans une clé ne provoque aucune erreur, elle crée une entrée de plus. Un dictionnaire censé avoir trois clés en a alors quatre, et le programme continue.
ages["Inconnu"] lève KeyError — contrairement à l'écriture, qui aurait créé l'entrée. Quand l'absence est un cas normal, deux réflexes :
if "Inconnu" in ages: # tester avant de lire
...
ages.get("Inconnu", 0) # ou demander une valeur par défaut
get ne crée rien : il renvoie la valeur par défaut sans toucher au dictionnaire.
Exercices du chapitre
- Écrire fusion(d1, d2) renvoyant un nouveau dictionnaire contenant les… corrigé
- Écrire inverse(d) qui échange clés et valeurs corrigé
- Écrire occurrences avec la variante get , puis vérifier sur mille… corrigé
- Écrire cle du maximum(d) corrigé
- Reprendre le code suivant, qui veut supprimer les entrées de petite… corrigé
- Écrire table de frequences qui, à partir d'un dictionnaire… corrigé