4.5. Les dictionnaires

Les listes sont des structures de données indispensables lorsque l’on souhaite rassembler sous le même nom une collection d’éléments de taille arbitraire. Cependant, le seul moyen de désigner et différencier les éléments est leur position dans la liste, contrairement aux variables qui portent un nom. Cela ne pose pas de problème lorsqu’il s’agit, par exemple, d’additionner un nombre arbitraire de valeurs numériques, ou d’enregistrer des données saisies par un utilisateur dans un certain ordre.

Il arrive parfois néanmoins que l’on ait besoin d’autres moyens de désigner les différents éléments d’une collection. Par exemple, si l’on souhaite tenir l’inventaire d’un magasin, on pourrait déclarer une liste contenant les quantités de chaque produit en stock afin d’être ensuite en mesure de les lire et les mettre à jour.

inventory = [
    4,   # framboises
    11,  # pommes
    6,   # fraises
    19,  # myrtilles
    3,   # melons
    15   # pastèques
]

Le souci est qu’il faut se souvenir de quel produit correspond à quelle quantité, en fonction de sa position dans la liste. Les dictionnaires permettent justement de résoudre ce problème.

Tout comme les listes et les tuples, les dictionnaires sont des structures de données servant de conteneurs pour un nombre arbitraire de valeurs. Cependant, contrairement aux listes et aux tuples, les dictionnaires ne rangent pas leurs éléments dans un ordre spécifique. On n’y accède donc pas via leur indice, mais au moyen d’une clé unique (un nom) qu’on leur attribue au moment de leur insertion et qui permet de les identifier par la suite. Cette structure est donc analogue à un dictionnaire terminologique regroupant des termes (les clés, en l’occurrence triées par ordre alphabétique) et leur définition (les valeurs).

4.5.1. Déclaration de dictionnaire

Les dictionnaires sont déclarés à l’aide de deux accolades ({, }) entre lesquelles on inscrit des paires clé-valeur séparées par des virgules, comme pour les autres structures de données. La clé, quant à elle, est séparée de sa valeur par le symbole :.

empty_dict = {}  # dictionnaire vide
my_dict = {"clé1": "valeur1", "clé2": 24, 3.0: True}

4.5.2. Accéder aux éléments d’un dictionnaire

On accède aux valeurs en fournissant la clé correspondante entre crochets ([, ]) après le nom du dictionnaire.

my_dict = {"clé1": "valeur1", "clé2": 24, 3.0: True}

print(my_dict["clé1"])
print(my_dict["clé2"])
print(my_dict[3.0])
valeur1
24
True

Même si les clés sont la plupart du temps des chaînes de caractères, n’importe quel type de donnée peut être utilisé à condition que chaque clé soit unique. En outre, les clés doivent être immuables, c’est-à-dire que leur valeur ne doit pas être modifiée après leur création.

Reprenons l’exemple de l’inventaire, mais cette fois-ci avec un dictionnaire, dans le but d’afficher son contenu dans la console. Lorsque l’on parcourt le dictionnaire, la variable d’itération prend tour à tour la valeur de chaque clé et on peut donc accéder directement à l’élément correspondant à l’aide de la notation indexée. On peut également utiliser la fonction len(dictionary) pour obtenir le nombre d’éléments (paires clé-valeur) contenus dans le dictionnaire.

inventory = {
    "framboises": 4,
    "pommes": 11,
    "fraises": 6,
    "myrtilles": 19,
    "melons": 3,
    "pastèques": 15
}

print(f"L'inventaire contient {len(inventory)} produits :")
for key in inventory:                                     # pour chaque clé de l'inventaire...
    print(f"- Il reste {inventory[key]} {key} en stock")  # on affiche l'élément associé
L'inventaire contient 6 produits :
- Il reste 4 framboises en stock
- Il reste 11 pommes en stock
- Il reste 6 fraises en stock
- Il reste 19 myrtilles en stock
- Il reste 3 melons en stock
- Il reste 15 pastèques en stock

La figure 4.4 ci-dessous illustre la structure d’un dictionnaire et la manière d’accéder à ses éléments. Le dictionnaire dct comprend 3 paires clé-valeur. Les clés sont toutes des chaînes de caractères ("a", "b" et "PI") alors que les valeurs associées sont de types différents : un nombre entier, une chaîne de caractères et un nombre décimal. On peut accéder directement à une valeur du dictionnaire à l’aide de l’opérateur d’indexation en spécifiant le nom de sa clé, comme par exemple dct["PI"] pour obtenir la valeur 3.14 stockée dans le dictionnaire.

Dictionnaire

Fig. 4.4 Dictionnaire.

4.5.3. Modifier le contenu d’un dictionnaire

On peut ajouter une paire clé-valeur ou modifier la valeur d’une clé existante dans un dictionnaire en spécifiant simplement l’élément concerné par sa clé, de la manière suivante.

my_dict[new_key] = value           # ajout d'une nouvelle paire clé-valeur
my_dict[existing_key] = new_value  # modification de la valeur d'une clé existante

Reprenons l’exemple de notre inventaire pour illustrer ces fonctionnalités.

inventory = {
    "framboises": 4,
    "pommes": 11,
    "fraises": 6,
    "myrtilles": 19,
    "melons": 3,
    "pastèques": 15
}

while True:  # boucle infinie
    print(f"\nL'inventaire contient {len(inventory)} produits :") # on affiche l'inventaire
    for key in inventory:
        print(f"Il reste {inventory[key]} {key} en stock")

    product = input("\nQuel produit ajouter/modifier ? ")  # on demande un nom de produit...
    quantity  = input("Nouvelle valeur : ")                # et une quantité
    inventory[product] = quantity  # on ajoute le produit si absent ou on modifie sa quantité
L'inventaire contient 6 produits :
- Il reste 4 framboises en stock
- Il reste 11 pommes en stock
- Il reste 6 fraises en stock
- Il reste 19 myrtilles en stock
- Il reste 3 melons en stock
- Il reste 15 pastèques en stock

Quelle produit ajouter/modifier ? ananas
Nouvelle valeur : 5

L'inventaire contient 7 produits :
- Il reste 4 framboises en stock
- Il reste 11 pommes en stock
- Il reste 6 fraises en stock
- Il reste 19 myrtilles en stock
- Il reste 3 melons en stock
- Il reste 15 pastèques en stock
- Il reste 5 ananas en stock

Quelle produit ajouter/modifier ? myrtilles
Nouvelle valeur : 7

L'inventaire contient 7 produits :
- Il reste 4 framboises en stock
- Il reste 11 pommes en stock
- Il reste 6 fraises en stock
- Il reste 7 myrtilles en stock
- Il reste 3 melons en stock
- Il reste 15 pastèques en stock
- Il reste 5 ananas en stock

Quelle produit ajouter/modifier ?
...

Note

Puisque la boucle créée ici est infinie (elle n’a pas de condition d’arrêt), on doit interrompre le programme manuellement (avec CTRL+C).

On supprime une paire clé-valeur d’un dictionnaire à l’aide de la fonction pop(), comme pour les listes, en indiquant la clé comme paramètre. Cette fonction renvoie la valeur associée à la clé.

inventory = {
    "framboises": 4,
    "pommes": 11,
    "fraises": 6,
    "myrtilles": 19,
    "melons": 3,
    "pastèques": 15
}

print(inventory)
print(inventory.pop("pastèques"))
print(inventory)
{'framboises': 4, 'pommes': 11, 'fraises': 6, 'myrtilles': 19, 'melons': 3, "pastèques": 15}
15
{'framboises': 4, 'pommes': 11, 'fraises': 6, 'myrtilles': 19, 'melons': 3}

4.5.4. Test d’appartenance

Il existe deux méthodes principales pour déterminer si une clé existe ou non dans un dictionnaire :

  1. On utilise la fonction get(), qui renvoie la valeur associée à la clé en paramètre ou None si la clé n’existe pas.

  2. On utilise le mot réservé in, qui fonctionne également avec d’autres types composites (listes, tuples, chaînes de caractères).

inventory = {"framboises": 4, "pommes": 11, "fraises": 6, "myrtilles": 19, "melons": 3}

if inventory.get("kiwi"):
    print("kiwi est une clé du dictionnaire")
else:
    print("kiwi n'est pas une clé du dictionnaire")

if "pommes" in inventory:
    print("pommes est une clé du dictionnaire")
else:
    print("pommes n'est pas une clé du dictionnaire")
kiwi n'est pas une clé du dictionnaire
pommes est une clé du dictionnaire