Accueil » Leçon 7 - Les dictionnaires

Leçon 7 - Les dictionnaires

Objectifs de la leçon :

L'objectif de la leçon est de comprendre la notion de dictionnaire. 

Les dictionnaires sont des structures de données basées sur le système clé-valeur.

Exemples :

Dictionnaire de voitures
(Registre des immatriculations)
Dictionnaire de n° de téléphone
(Répertoire)
Dictionnaire de mots
(Dictionnaire ;-))
Clé Valeur Clé Valeur Clé Valeur
DE – 258 - FR Durand 01 25 46 98 35 Pierre Table Objet destiné à poser des choses dessus
RU – 149 – KP Dupont 03 68 74 58 95 Michel Chaise Objet destiné à s’assoir
JN – 368 – TR Gaspard +33 125 45 89 63 Gérard Lampe Objet destiné à éclairer
FT – 347 – LO Pirrot
Ce dictionnaire a 4 entrées.
Les clés sont les immatriculations.
Les valeurs sont les noms des propriétaires.
Ce dictionnaire a 3 entrées.
Les clés sont les numéros de téléphone.
Les valeurs sont les noms des correspondants.
Ce dictionnaire a 3 entrées.
Les clés sont les mots à définir.
Les valeurs sont leur définition.
Un vrai dictionnaire au sens propre du terme.

A la différence des listes dans lesquelles les index sont des entiers dépourvus de sens, les dictionnaires sont indexés par des clés textuelles qui ont du sens.

Par exemple, si mon dictionnaire de voitures s'appelle Immat, j'écrirai :

Immat["DE – 258 - FR"] = "Durand"
Pré-requis :

La leçon 1 : afficher, saisir, les variables, les calculs.

La leçon 2 : les structures conditionnelles.

La leçon 3 : les fonctions. Conseillé mais pas indispensable.

La leçon 4 : les boucles.

La leçon 5 : les listes.


Des exemples pour démarrer

Exemple : Registre des immatriculations
Observez le code suivant qui concerne des immatriculations de voitures et leur propriétaire :
  • Ce dictionnaire s'appelle Immat.
  • Pour l'instant il a 3 entrées.
  • Les couples clé/valeur sont séparés par des deux points.
  • Les entrées sont séparées par des virgules, comme dans les listes.
  • La liste des couples est encadrée par des accolades (et non des crochets comme dans les listes).


Exemple : Afficher une entrée spécifique :

On accède à la valeur d'un clé via les [ ], comme pour les listes.
On peut aussi utiliser la méthode get.


Exemple : Une nouvelle voiture.

Pour ajouter une entrée, on crée une nouvelle clé et on donne sa valeur.


Il n'y a pas d’ordre dans un dictionnaire. Le programmeur ne gère pas l'ordre dans lequel les éléments sont insérés.
Il est fort possible que dans l'exemple précédent, l'affichage ne respecte pas l’ordre des entrées.


Exemple : Dupont a vendu sa voiture à Dumoulin

Pour modifier la valeur affectée à une clé, on lui affecte sa nouvelle valeur.


 

Exemple : A la casse !

La voiture immatriculée "RU – 149 – KP" part à la casse, on la supprime du dictionnaire grâce à la commande del.

L'ESSENTIEL AVEC DES EXEMPLES DE BASE

A la fin de cette leçon, vous devrez bien savoir :

  • Définir un dictionnaire.
  • L'utiliser, le modifier.
  • Reconnaître une situation métier dans laquelle l'utilisation des dictionnaires apporte un plus.


Définir un dictionnaire.

Un dictionnaire est une structure de données reposant sur le système clé/valeur.

Exemple : Parc informatique.

Voici un dictionnaire qui est une ébauche très succincte d'un parc informatique.
Chaque couple clé/valeur est composé :
  • du numéro de série qui est la clé ;
  • de l'emplacement du PC dans l'entreprise (un numéro de bureau)

Ce dictionnaire possède 4 entrées et il porte le nom de ParcInfo.

Notez bien :
  • Les couples clé/valeur sont séparés par des deux points.
  • Les entrées sont séparées par des virgules, comme dans les listes.
  • La liste des couples est encadrée par des accolades (et non des crochets comme dans les listes).


Ajouter ou supprimer des entrées.

Exemple : Ajouter une entrée.

Un nouveau PC arrive dans le bureau B214.
Pour ajouter une entrée, on définit une nouvelle clé et on lui affecte une valeur.
 
Remarquez que :
  • 2 clés distinctes peuvent avoir la même valeur (ici, 2 PC dans le bureau B214) ;
  • un dictionnaire ne peut pas avoir 2 clés égales. Les clés sont des identifiants uniques. L'affectation d'une nouvelle valeur à une clé existante ne crée pas de nouvelle entrée mais remplace l'ancienne entrée.



Exemple : Supprimer une entrée.

On supprime l'ancien PC du bureau B214.
Pour supprimer une entrée, on efface la clé en utilisant la commande del.
 


Récupérer une valeur connaissant la clé.

Exemple : Retrouver une valeur.

Pour afficher une valeur connaissant la clé, on peut :
  • utiliser les crochets [ ] comme pour les listes ;
  • utiliser la méthode get.




Tester l'existence d'une clé.

Exemple : La clé existe ?

Pour tester l'existence d'un clé, on utilise le mot-clé in.



Afficher toutes les clés, toutes les valeurs ou toutes les entrées.

Les méthodes keys, values, items retournent respectivement les listes des clés, des valeurs ou de toutes les entrées.

Exemple : Afficher toutes les clés.

La méthode keys des dictionnaires retourne la liste des clés.


Exemple : Afficher toutes les valeurs.

La méthode values des dictionnaires retourne la liste des valeurs.


Exemple : Afficher toutes les entrées.

La méthode items des dictionnaires retourne la liste des entrées, c'est à dire tous les couples clé/valeur.

Quelques exemples plus poussés

 

Mon parc machine trié par système d'exploitation :

Exemple : Trier des machines selon leur OS

L'exemple suivant se situe dans le contexte de la gestion d'un parc informatique. Dans ce parc informatique,
  • chaque matériel est identifié par un numéro d'inventaire ;
  • chaque matériel est stocké comme un dictionnaire mémorisant ses caractéristiques (numéro d'inventaire, OS et version) :
    {"NumInv":"NI0001" , "OS":"Linux" , "Version":"12.04"}
  • le parc informatique est la liste des des machines (donc une liste de dictionnaires). Voilà les 2 premières machines :
    ParcInfo = [ {"NumInv":"NI0001" , "OS":"Linux" , "Version":"12.04"} , \
    {"NumInv":"NI0002" , "OS":"Mac OS X" , "Version":"10.11"} , \
    ... ]



Faites tourner le code ci-dessous et revenez lire ceci :

  • #1 : on crée la liste ParcInfo qui contient 6 machines structurées chacune comme un dictionnaire.
  • #2 : on crée 3 listes vides destinées à recevoir les machines selon leur OS
  • #3 : on parcourt le parc :

for machine in ParcInfo :
if machine["OS"]=="Mac OS X" :
LMac.append( [ machine["NumInv"] , machine["Version"] ] )
Pour chaque machine du ParcInfo (qui est un dictionnaire) :

Si c'est un Mac :

on ajoute dans la liste des Macs une sous-liste constituée du numéro d'inventaire et de la version.


  • #4 : affichage :

print ("\nMac :")
for i in LMac :
print (i)
Chaque élément de LMac est une sous-liste à 2 éléments qu'on affiche.


Gestion minimaliste d'une DVDThèque :

Exemple : Gestion d'une DVDThèque

Cet exemple décrit la gestion d'une DVDThèque très minimaliste. L'objectif est de passer en revue l'ensemble des fonctionnalités offertes par les dictionnaires. Ce code sert de base à un exercice que vous réaliserez en fin de leçon.
Le dictionnaire en question est ici l'ensemble des abonnés. La clé de chaque abonné est son prénom et la valeur est le nombre de DVD qu'il a empruntés (qui sont en cours d'emprunt).

Ce code est structuré en 11 blocs :
  1. Définition d'une fonction qui affiche l'état d'un abonné.
  2. Définition d'une fonction qui affiche l'état global de la DVDThèque.
  3. Création de la DVDThèque avec 4 abonnés.
  4. Affichage de l'état des abonnés un par un.
  5. Affichage de l'état de la DVDThèque.
  6. Recherche de l'abonné ayant le plus d'emprunts en cours.
  7. Ajout d'un nouvel abonné.
  8. Emprunt d'un abonné.
  9. Retour d'un abonné.
  10. Recherche d'un abonné donné.
  11. Suppression d'un abonné.

 

Des pièges à éviter


Penser qu'il y a un ordre dans les dictionnaires :

On ne peut absolument rien présager sur la façon dont les dictionnaires sont parcourus. Les fonctions keys, items, values retournent des résultats indépendants de l'ordre dans lequel les éléments sont entrés dans le dictionnaire.

Exemple : Des clés dans le "désordre"

Affichage des clés d'un dico. Il est peu probable que les clés soient affichées dans l'ordre d'insertion.
Relancez le programme plusieurs fois et il est fort probable que l'affichage change d'une fois sur l'autre.


Croire qu'on peut donner deux valeurs à une même clé :

Les clés sont uniques. En essayant de donner une autre valeur à une même clé, on ne fait que changer sa valeur mais on n'en crée pas de nouvelle. L'ancienne valeur est perdue.

Exemple : Les clés sont uniques !

On voulait rajouter un OS "UBUNTU" sur la machine "2105U" mais ça a supprimé l'ancien "Windows".
En revanche, on peut donner une liste de valeurs à une clé (C.F. Bon à savoir).

Bon à savoir


Des listes comme valeurs.

Les valeurs des clés d'un dictionnaire peuvent être des listes.

Exemple : Mes amis ont plusieurs numéros de téléphone.

Dans mon répertoire, les clés sont les initiales de mes amis et les valeurs la liste de leurs numéros de téléphone.
La double boucle for imbriquée affiche mes amis et leurs numéros.


Des dictionnaires comme valeurs.

Les valeurs des clés d'un dictionnaire peuvent elles-même être des dictionnaires.

L'exemple ci-dessous vous montre ce qu'on pourrait appeler un dictionnaire bi-dimensionnel.

Exemple : Mon parc informatique un peu plus élaboré.

Dans mon parc informatique :
  • les clés sont les numéros de série des machines ;
  • les valeurs sont les dictionnaires de leurs caractéristiques.

La double boucle for imbriquée affiche les machines et leurs caractéristiques.


Vider un dictionnaire.

Exemple : Enfin libre, je me débarrasse de mon parc informatique.

La méthode clear vide les dictionnaires


Longueur d'
un dictionnaire.

Exemple : Nombre d'entrées d'un dictionnaire.

La fonction len permet d'obtenir le nombre d'entrées d'un dictionnaire, c'est à dire le nombre de couples clé/valeur. 

Le quizz

Exercice à choix multiple : Modèle des dictionnaires.
Quel est le modèle des dictionnaires ?
Bien !

Exercice à choix multiple : Unicité des clés.
Un dictionnaire peut contenir deux clés égales si elles ont des valeurs différentes.
Bien !

Exercice à choix multiple : Unicité des valeurs.
Deux clés différentes d'un dictionnaire peuvent avoir la même valeur.
Bien !

Exercice à choix multiple : Modifier une clé.
Un répertoire téléphonique est structuré comme un dictionnaire dans lequel les clés sont les numéros de téléphone et les valeurs les noms des correspondants.
Quelle est la bonne syntaxe pour modifier le numéro de mon ami Pierre qui vient d'en changer ?
Bien !

Exercice à choix multiple : Méthodes de base.
Pour obtenir tous les couples clé-valeur d'un dictionnaire, j'utilise :
Bien !

Exercice à choix multiple : Méthodes de base.
Pour obtenir toutes les clés d'un dictionnaire, j'utilise :
Bien !

Exercice à choix multiple : Méthodes de base.
Pour obtenir toutes les valeurs d'un dictionnaire, j'utilise :
Bien !

Exercice à réponse courte : Longueur d'un dictionnaire.
Qu'affiche le code ci-dessous ?
ParcInfo = {"2105U":"Bureau A201" , "3745S":"Bureau B214" , "1857T":"Bureau B325" , "7485V":"Bureau C204", "3257V":"Bureau B214"}

print(len(ParcInfo))
Bien !

Exercice à réponse courte : Liste des clés.
Qu'affiche le code ci-dessous ?
ParcInfo = {"2105U":"Bureau A201" , "3745S":"Bureau B214" , "1857T":"Bureau B325" , "7485V":"Bureau C204", "3257V":"Bureau B214"}
ParcInfo["3745S"] = "Bureau B320"
del(ParcInfo["1857T"])
ParcInfo["9999J"] = "Bureau B512"
print(len(ParcInfo.keys()))
Bien !

 

Exercice à choix multiple : Liste des valeurs.
Le code suivant affiche :
ParcInfo = {"2105U":"Bureau A201" , "3745S":"Bureau B214" , "1857T":"Bureau B325" , "7485V":"Bureau C204", "3257V":"Bureau B214"}
for bureau in ParcInfo.values() :
if not "B" in bureau :
print (bureau)
Bien !

Exercice à réponse courte : existence d'une clé.
Qu'affiche le code ci-dessous ?
ParcInfo = {"2105U":"Bureau A201" , "3745S":"Bureau B214" , "1857T":"Bureau B325" , "7485V":"Bureau C204", "3257V":"Bureau B214"}
if "7485V" in ParcInfo.keys() :
print (ParcInfo["7485V"])
Bien !

Exercice à choix multiple : Existence d'une clé.
Ce code :
ParcInfo = {"2105U":"Bureau A201" , "3745S":"Bureau B214" , "1857T":"Bureau B325" , "7485V":"Bureau C204", "3257V":"Bureau B214"}
if "1857t" in ParcInfo.keys() :
print (ParcInfo["1857T"])
Bien !

 

Questions souvent posées


J'ai repris votre exemple du Parc informatique mais j'ai une machine avec 2 OS. Je voudrais donc avoir deux valeurs pour la même clé mais la clé est unique, comment faire ?

On a le droit de donner une liste comme valeur d'une clé :

Exemple : Double boot : 2 OS sur ma machine

La machine 3575S a deux OS.


Est-ce qu'on peut donner des valeurs de types différents dans un dictionnaire ?

Tout à fait :

RecetteCrepes =  { "Nombre de personnes":6 , "Farine":200 , "sel":"Une pincée" , "Aromes possibles":["citron","Rhum","cidre"]}
Ici, les valeurs sont de type entier, chaines de caractères et listes.

Exemples de questions de cours

  • Décrire le principe des dictionnaires.
  • Quelles sont les différences importantes entre les listes et les dictionnaires ?
  • Quelles sont les principales fonctions de parcours des dictionnaires ?
  • Donnez un exemple pertinent de dictionnaire de dictionnaires.

Des exercices pour s'entraîner

Exercice de code : Un dictionnaire dans l'ordre alphabétique.

On considère un "vrai" dictionnaire nommé Dico dont les clés sont des mots et les valeurs leur définition.
Ce dictionnaire est déjà créé dans l'espace dédié à votre code
Ecrire un programme qui affiche ce dictionnaire au format suivant :

Imprimante -> Matériel d'impression
NAS -> Matériel de stockage
PC -> Ordinateur personnel
Routeur -> matériel de routage

Vous pouvez entrer des données pour le programme dans la boîte ci-dessous.

Exercice de code : Un dictionnaire partant de la définition la plus longue.

On considère un "vrai" dictionnaire nommé Dico dont les clés sont des mots et les valeurs leur définition.
Ce dictionnaire est déjà créé dans l'espace dédié à votre code
Ecrire un programme qui affiche ce dictionnaire en partant du mot qui a la définition la plus longue puis dans l'ordre des définitions décroissantes :

Table -> Meuble composé d'un plateau horizontal reposant sur un ou plusieurs pieds ou supports. Servant notamment pour les repas
Commode -> Meuble à hauteur d'appui garni, le plus souvent, de tiroirs
Fauteuil -> Siège à dossier et à bras pour une personne
Chaise -> Siège à dossier, sans bras

Vous pouvez entrer des données pour le programme dans la boîte ci-dessous.

Un résumé produit par des étudiants

Résumé du chapitre 7

Il a été réalisé par Maxence GRYMONPREZ et Alexandre GVOZDENOVIC, promo 2016-2017

Une page synthétique, qui résume tout et qui est agréable à l’œil.

ah ah ah