Chapitre 3 : Les dictionnaires


Introduction

Prenons l'exemple d'un répertoire téléhonique. Nous pouvons la modéliser simplement comme tableau (ou liste) de tuples (nom,numéro).

In [ ]:
liste_tel = [("Paul", 5234),
             ("Emile", 5345),
             ("Victor", 5186),
             ("Rose", 5678),
             ("Hélène", 5432)
            ]

Si nous voulons appeler Rose, nous avons deux possibilités avec une telle liste:

  • soit nous savons que les informations la concernant sont dans le quatrième élément de la liste (ce qui ne semble pas très pratique et réaliste)
  • soit nous cherchons dans la liste en partant du premier élément de la liste jusqu'à ce que nous trouvions Rose (ce qui revient à feuilleter son répertoire)

Comme l'accès, la modification ou l'ajout d'une information devraient être possible sans devoir feuilleter tout le répertoire, il semble plus pratique d'associer à un nom un numéro, autrement dit d'associer à une clé une information.

C'est ce que nous allons faire avec un dictionnaire.

Les dictionnaires en Python

Un dictionnaire est un ensemble non ordonné de paires (clé, valeur) avec un accès très rapide à la valeur à partir de la clé.

Une clé peut être de type alphabétique, numérique, ou même de type construit sous certaines conditions. Les valeurs pourront être de tout type sans exclusion.

Le dictionnaire est un objet mutable, autrement dit, on peut le modifier.

I. Comment créer un dictionnaire ?

Plusieurs méthodes permettent de créer un dictionnaire.

Méthode 1 : création d'un dictionnaire vide puis ajout de paires clé-valeur dans le dictionnaire.

Création d'un dictionnaire vide :

In [ ]:
d1 = {}     # Création d'un dictionnaire vide.
            # Autre notation : d1 = dict()
type(d1)    # <type 'dict'>

Ajout de paires clé-valeur dans le dictionnaire :

In [ ]:
d1["Paul"]=5234
d1["Emile"]=5345
d1["Victor"]=5186
print(d1)

Méthode 2 : création d'un dictionnaire noté en extension.

In [ ]:
d2 = {'Paul': 5234, 'Emile': 5345, "Victor" : 5186}
print(d2)

Méthode 3 : création d'un dictionnaire créé à partir d'un tableau de couples.

In [ ]:
tab = [("Paul",5234),("Emile",5345),("Victor",5186)]
print(tab)
dic = dict(tab)
print(dic)

Méthode 4 : création d'un dictionnaire en compréhension.

In [ ]:
carre = {k: k ** 2 for k in range(1, 11)}
print("carrés parfaits de 1 à 100 =>", carre)

II. Opérations sur les dictionnaires

A. Obtenir la valeur d'un élément d'un dictionnaire

In [ ]:
numero = d1["Victor"]
print("Le numéro de téléphone de Victor est le :", numero)

Si la clé n'existe pas dans le dictionnaire, une exception de type KeyError sera levée.

In [ ]:
d1["Rose"]

Variante : La methode get()permet de récupérer une valeur dans un dictionnaire et si la clé est introuvable, vous pouvez donner une valeur à retourner par défaut :

In [ ]:
d1.get("Paul")
In [ ]:
d1.get("Rose") # la clé "Rose" n'existe pas donc aucune valeur n'est retournée
In [ ]:
d1.get("Paul","Cette personne ne figure pas dans votre répertoire.")
In [ ]:
d1.get("Rose","Cette personne ne figure pas dans votre répertoire.")

B. Modifier la valeur d'un élément d'un dictionnaire

Un dictionnaire est un objet mutable. On peut modifier la valeur associée à une clé :

In [ ]:
d1["Emile"] = 5151
d1

C. Supprimer un élément d'un dictionnaire

La fonction del() permet de supprimer une paire clé-valeur :

In [ ]:
del d1["Emile"]
d1

D. Supprimer tous les éléments d'un dictionnaire

La méthode clear() permet d'effacer un dictionnaire.

In [ ]:
d2.clear()
d2

E. Déterminer la taille d'un dictionnaire

Un dictionnaire est une collection. La fonction len() renvoie le nombre d'éléments :

In [ ]:
len(d3)

Activité 1 : création d'un répertoire téléphonique

Vous disposez d'un tableau de contacts prénom-numéro_de_téléphone nommée liste_tel.

Activez ce tableau :

In [ ]:
liste_tel = [("Paul", 5234),
             ("Emile", 5345),
             ("Victor", 5186),
             ("Rose", 5678),
             ("Hélène", 5432)
            ]
  1. Créez un répertoire téléphonique nommé rep_tel sous la forme d'un dictionnaire à partir du tableau de tuples liste_tel et affichez ce dictionnaire :
In [ ]:
 
  1. Ajoutez le contact suivant à votre répertoire téléphonique : (Gaëlle : 4526) et affichez le numéro de téléphone de Paul :
In [ ]:
 
In [ ]:
 
  1. Quelle instruction permet de connaître le nombre d'éléments présents dans votre répertoire téléphonique :
In [ ]:
 
  1. Enlevez Victor de vos contacts et affichez l'ensemble de votre répertoire :
In [ ]:
 

III. Itérer sur les éléments d'un dictionnaire

Lorsque l'on parcoure un dictionnaire avec une boucle for on parcoure en réalité les clés du dictionnaire.

In [ ]:
rep_tel = {"Paul" : 5234,
           "Emile" : 5345,
           "Victor" : 5186,
           "Rose" : 5678,
           "Hélène" : 5432,
           "Gaëlle" : 4526}

for x in rep_tel:
    print(x)

On peut alors afficher tout le contenu de notre dictionnaire avec une boucle.

In [ ]:
for x in rep_tel:
    print("la clé", x, "est associée à la valeur", rep_tel[x])

Pour ne pas avoir à se souvenir que ce sont les clés qui sont parcourues, il existe trois méthodes permettant de parcourir un dictionnaire en précisant de manière explicite quels sont les éléments parcourus.

  • La méthode keys() permet de parcourir l'ensemble des clés;
  • La méthode values() permet de parcourir l'ensemble des valeurs;
  • La méthode items() permet de parcourir l'ensemble des paires (clé, valeur);

Voici comment itérer itérer sur un dictionnaire grâce à ces méthodes.

A. La méthode keys()

On peut utiliser la méthode keys() pour récupérer les clés d'un dictionnaire. Cette méthode renvoie la séquence des clés utilisées dans le dictionnaire.

In [ ]:
rep_tel.keys()

Si on veut récupérer un tableau contenant les clés du dictionnaire on utilise la fonction list().

In [ ]:
list(rep_tel.keys())

Exemple : On parcourt donc ainsi les clés du dictionnaire :

In [ ]:
rep_tel = {"Paul" : 5234, "Emile" : 5345, "Victor" : 5186, "Rose" : 5678, "Hélène" : 5432, "Gaëlle" : 4526}
for cle in rep_tel.keys():  # ou for e in list(rep_tel.keys()):
    print(cle)

B. La méthode values()

On peut utiliser la méthode values() pour récupérer les valeurs d'un dictionnaire. Cette méthode renvoie la séquence des valeurs utlisées dans le dictionnaire.

In [ ]:
rep_tel.values()

Si on veut récupérer un tableau contenant les valeurs du dictionnaire on utilise la fonction list().

In [ ]:
list(rep_tel.values())

Exemple : On parcourt donc ainsi les valeurs du dictionnaire :

In [ ]:
rep_tel = {"Paul" : 5234, "Emile" : 5345, "Victor" : 5186, "Rose" : 5678, "Hélène" : 5432, "Gaëlle" : 4526}
for valeur in rep_tel.values():  # ou for e in list(rep_tel.values()):
    print(valeur)

C. La méthode items()

La méthode items() extrait du dictionnaire la séquence des paires (clé, valeur).

In [ ]:
rep_tel.items()

Si on veut récupérer un tableau contenant les paires (clé, valeur) du dictionnaire on utilise la fonction list().

In [ ]:
list(rep_tel.items())

Exemple : On parcourt donc ainsi les couples (clé, valeur) du dictionnaire :

In [ ]:
rep_tel = {"Paul" : 5234, "Emile" : 5345, "Victor" : 5186, "Rose" : 5678, "Hélène" : 5432, "Gaëlle" : 4526}
for cle, valeur in rep_tel.items():
    print("Le numéro de", cle, "est :", num)

IV. Tests d'appartenance

On peut aussi interroger l'appartenance d'une valeur ou d'une clé grace à l'expression in.

In [ ]:
"Rose" in rep_tel.keys()
In [ ]:
5180 not in rep_tel.values()

Variantes : has_key(),...

Activité 2 : Comme dans les smartphones

L'objectif de cette activité est de programmer deux des fonctionnalités importantes des smartphones actuels :

  • Ajouter un contact au répertoire ;
  • Rechercher un contact dans le répertoire.

On suppose pour simplifier que le repertoire téléphonique est mémorisé dans le smartphone sous la forme d'un dictionnaire et que chaque élément du dictionnaire est une paire (prénom, numéro) où prénom est la clé et numéro la valeur associée.

Première partie : Ajouter un contact

On considère que le répertoire téléphonique est mémorisé dans le dictionnaire repertoire. Quelques contacts sont déjà enregistrés dans ce répertoire.

In [ ]:
repertoire = {'David': 1010, 'Mélanie': 1111, 'Alain': 121212}
  1. Complétez la fonction ajout_contact(repertoire) qui demande à l'utilisateur de saisir les données (prénom et numéro de téléphone) d'un contact et qui ajoute ce contact à repertoire.
In [ ]:
def ajout_contact(repertoire):
    # A COMPLETER

# TEST
repertoire = {'David': 1010, 'Mélanie': 1111, 'Alain': 121212}
ajout_contact(repertoire)  # on appelle la fonction ajout_contact
repertoire # on affiche le répertoire pour vérifier l'ajout du contact
  1. On utilise désormais cette fonction ajout_contact dans la fonction suivante qui a pour objectif d'ajouter des contacts au répertoire autant de fois que l'on souhaite. Plus précisément, une fois qu'un contact a été saisi on demande à l'utilisateur s'il souhaite ajouter un autre contact. Compléter la fonction remplissage en conséquence.
In [ ]:
def remplissage(repertoire):
    encore = True
    while encore == True:
        # --------------
        # à compléter
        # --------------
        
# TEST
#repertoire = {'David': 1010, 'Mélanie': 1111, 'Alain': 121212}
remplissage(repertoire)  # on appelle la fonction remplissage pour compléter le répertoire
repertoire # on affiche ensuite le dictionnaire (une fois tous les contacts saisis)

Deuxième partie : Rechercher un contact

On souhaite maintenant écrire une fonction numero_de(prenom, repertoire) qui renvoie le numéro de prenom si prenom est bien dans repertoire et qui renvoie un message sinon.

  1. Si prenom est présent dans repertoire, quelle instruction permet d'afficher le numéro associé à prenom ?
In [ ]:
prenom = str(input("Entrer un prénom : "))
# à compléter
  1. Complétez la fonction numero_de(prenom, repertoire) qui renvoie le numéro de téléphone associé dans l'affirmative et un message d'erreur sinon.
In [ ]:
def numero_de(prenom, repertoire):
    '''prenom est une chaine de caractères et repertoire est un dictionnaire'''
    # à compléter

# TEST
prenom = str(input("Entrer le prénom du contact cherché : "))
numero_de(prenom, repertoire)

Références

  • Ce document est fortement inspiré d'un document de Laurent CHAUDET et Xavier CHAUVIN
  • Equipe pédagotique DIU EIL Nantes : Les types construits - les dictionnaires et les ensembles.
  • Apprendre à programmer avec Python 3, livre de Gérard Swinnen (en téléchargement libre) http://inforef.be/swi/python.htm
  • Apprenez à programmer en Python, Vincent LE GOFF, OpenClassrooms, 2ème édition. Cours disponible sur Open Classrooms et ancienne version du livre disponible en pdf
  • Numérique et Sciences Informatiques, 1re, T. BALABONSKI, S. CONCHON, J.-C. FILLIATRE, K. NGUYEN, éditions ELLIPSES : Site du livre

Germain BECKER & Sébastien POINT, Lycée Mounier, ANGERS Licence Creative Commons