8. Les dictionnaires et leurs opérateurs

0

Pour ce huitième chapitre de notre cours Python, nous allons nous intéresser aux dictionnaires. Nous allons voir :

  • ce qu’est un dictionnaire,
  • comment créer un dictionnaire,
  • et comment y accéder.

Nous verrons également:

  • comment modifier une valeur d’un dictionnaire,
  • comment effacer des entrées,
  • et comment utiliser les dictionnaires dans des boucles.

Définition

Un dictionnaire est une structure de données très pratique qui permet d’associer une clé à une valeur. Chaque clé doit être unique dans le dictionnaire, et elle peut être de type entier, chaîne de caractères ou encore booléen. La valeur associée à cette clé peut quant à elle être n’importe quel objet, y compris des structures complexes comme des listes ou d’autres dictionnaires.

Création d’un dictionnaire

Pour créer un dictionnaire vide, il suffit d’utiliser des accolades vides {}. Si nous voulons créer un dictionnaire qui va contenir les informations d’une recette de cuisine, nous pouvons créer une variable qu’on va appeler recipe, à laquelle on va assigner nos accolades vides :

Python
recipe = {}
print(recipe)

Si on lance le programme, on voit bien notre dictionnaire vide dans le terminal :

Pour ajouter des éléments à notre dictionnaire, il nous faut maintenant des paires de clés et de valeurs.

Pour notre recette, je suggère d’utiliser les clés « name », « time » et « ingredients » et de leur associer respectivement le nom de notre recette, le temps de préparation et une liste d’ingrédients nécessaires.

Afin d’ajouter ce mapping, on va tout d’abord déclarer une clé, comme la chaîne de caractères « name » par exemple. Cette clé est suivie d’un double point « : ». À droite du double point, on trouve la valeur qu’on veut associer à cette clé, par exemple « Apple pie ».

Pour finir, les différentes paires de clés / valeurs sont séparées par une virgule :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
}
print(recipe)

Et là, si on imprime notre dictionnaire, on voit bien les différentes associations qu’on vient de créer :

Notez que la valeur d’une clé d’un dictionnaire peut également être un dictionnaire. Nous pouvons donc faire la chose suivante :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}
print(recipe)

Et comme on peut le voir dans le terminal, si on exécute notre code, la clé ‘steps’ a bien un dictionnaire qui lui est associé :

Accéder à des valeurs

Pour accéder à la valeur associée à une clé précise d’un dictionnaire, on fait suivre notre dictionnaire par des crochets[] à l’intérieur desquels on passe la clé à laquelle on veut accéder. Dans notre exemple, si on veut accéder au nom de notre recette, on peut faire :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}
print(recipe["name"])

Ce qui nous donne donc « Apple Pie » :

Si on veut accéder à la clé « preparation » du dictionnaire qui est associé à la clé « steps » de notre recette, on peut le faire en utilisant les deux clés l’une à la suite de l’autre, donc tout d’abord on fait un recipe[« steps »] pour accéder au dictionnaire contenant les étapes et puis on ajoute de nouveaux crochets et la clé « preparation » comme suit : recipe[« steps »][« preparation »] afin d’accéder à la préparation :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}
print(recipe["steps"]["preparation"])

Ce qui nous donne :

Attention ! Si vous tentez d’accéder à une clé qui n’existe pas de cette manière, votre programme plantera.

Si, par exemple, on essaie d’accéder à la clé « description » qui n’est pas présente dans notre dictionnaire notre programme s’arrête avec l’erreur :

Pour éviter ce genre d’erreur, on peut utiliser la méthode get() des dictionnaires, à laquelle on passe la clé à laquelle on veut accéder. Si la clé existe, get() retourne la valeur associée à cette clé.

Sinon get() retourne la valeur None :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}
print(recipe.get("name"))
print(recipe.get("description"))

Ici, comme name existe, le premier print imprime « Apple Pie ». En revanche, comme la clé description n’existe pas, le deuxième print imprime la valeur None :

On peut passer un deuxième paramètre à get(), qui contient la valeur par défaut à retourner si jamais la clé passée en paramètre n’existe pas. Donc si nous souhaitons une chaîne de caractères vide au lieu de None si jamais notre clé n’existe pas, on peut faire la chose suivante :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}
print(recipe.get("name", ""))
print(recipe.get("description", ""))

Et donc, maintenant notre deuxième print nous renvoie bien une chaîne de caractères vide :

Modifier les valeurs d’un dictionnaire

Nous pouvons modifier la valeur associée à une clé donnée, en utilisant l’opérateur d’assignation « = » comme pour une variable classique. On peut donc changer le nom de notre recette de la manière suivante :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}
print(recipe.get("name", ""))
recipe["name"] = "Raspberry Pie"
print(recipe.get("name", ""))

Si on regarde le résultat de l’exécution de ce code, on voit bien que le nom de la recette change de « Apple Pie » à « Raspberry Pie » :

On peut aussi assigner une valeur à une nouvelle clé de la même manière. Nous pouvons donc ajouter un type à notre recette de la manière suivante :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}

recipe["name"] = "Raspberry Pie"
recipe["type"] = "pie"
print(recipe)

Ce qui nous donne bien :

On peut aussi modifier plusieurs clés en un coup, en utilisant la méthode update() qui prend un dictionnaire en paramètre avec les nouvelles valeurs à associer au dictionnaire. Nous pouvons donc remplacer notre code précédent de la manière suivante afin de modifier les clés « name » et « type » avec la méthode update() :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}

recipe.update({
    "name": "Raspberry Pie",
    "type": "pie"
})

print(recipe)

Et on a toujours le même résultat :

Effacer une clé

Imaginons qu’on souhaite effacer une clé de notre dictionnaire, par exemple la clé « steps ». Pour cela, on peut utiliser le mot-clé del suivi du dictionnaire auquel on passe la clé à effacer :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}

recipe.update({
    "name": "Raspberry Pie",
    "type": "pie"
})

del recipe["steps"]

print(recipe)

En exécutant ce code, on voit que la clé « steps » a bien été effacée :

Attention 1 : Faites bien attention à renseigner une clé qui existe dans le dictionnaire sinon votre code va crasher avec une « KeyError ».

Attention 2 : Faites aussi attention à toujours renseigner la clé à effacer sinon tout le dictionnaire sera effacé.

On peut aussi utiliser la méthode pop() à laquelle on passe une clé en paramètre afin d’effacer la clé en question. pop() a deux particularités. Premièrement, pop() retourne la valeur de la clé supprimée, et deuxièmement, on peut lui passer une valeur par défaut. Si on spécifie une valeur par défaut, et que la clé passée à pop() n’existe pas, le programme ne va pas crasher et va simplement retourner la valeur par défaut.
Nous pouvons donc faire les choses suivantes :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}

recipe.update({
    "name": "Raspberry Pie",
    "type": "pie"
})

del recipe["steps"]

deleted_time = recipe.pop("time", "-")
deleted_temperature = recipe.pop("temperature", None)

print(deleted_time)
print(deleted_temperature)
print(recipe)

Dans ce code, on efface donc la clé « time » et on stocke sa valeur dans la variable « deleted_time » et on essaie d’effacer la clé « temperature » qui n’existe pas, pop() nous retourne donc la valeur None, qu’on a spécifiée en tant que valeur par défaut.

Itérer sur un dictionnaire

En Python, on peut itérer à travers les clés d’un dictionnaire en utilisant une boucle for :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}

recipe.update({
    "name": "Raspberry Pie",
    "type": "pie"
})

del recipe["steps"]

deleted_time = recipe.pop("time", "-")
deleted_temperature = recipe.pop("temperature", None)

for key in recipe:
    print(f"{key} -> {recipe[key]}")

Ce qui nous donne bien chaque clé encore présente dans notre dictionnaire :

Si on veut itérer directement à travers toutes les clés et les valeurs associées, on peut utiliser la méthode items() d’un dictionnaire qui va retourner à chaque itération la clé de l’itération en cours et la valeur associée à celle-ci :

Python
recipe = {
    "name" : "Apple Pie",
    "time": "2h",
    "ingredients" : ["Flour", "Sugar", "Egg", "Apple"],
    "steps" : {
        "preparation": ["Cut apples", "Prepare dough"],
        "cooking": ["Cook for 2h at 200°C"]
    }
}

# recipe["name"] = "Raspberry Pie"
# recipe["type"] = "pie"

recipe.update({
    "name": "Raspberry Pie",
    "type": "pie"
})

del recipe["steps"]

deleted_time = recipe.pop("time", "-")
deleted_temperature = recipe.pop("temperature", None)

for key, value in recipe.items():
    print(f"{key} -> {value}")

Ce qui nous donne toujours le même résultat :

Félicitations! Vous savez maintenant comment utiliser les dictionnaires en Python ! Dans le prochain chapitre, on verra comment mieux structurer notre code et comment créer des modules.

Ressources

Vous retrouvez ci-dessous un lien vers le code source utilisé dans ce chapitre. Ce lien est uniquement disponible pour les abonnés Standard et Premium.

Laisser un commentaire