UKOnline

Dictionnaire

Un autre type de données très utilisé est le dictionnaire. Il s'agit d'un ensemble de paires associant une clé et une valeur. Ce type est également appelé tableau associatif dans d'autres langages de programmation.

Dans un même dictionnaire, chaque clé est unique. On peut en fait voir un dictionnaire comme une extension des séquences, où chaque élément est identifié de manière unique, non plus par un indice, mais par une clé. Une clé peut être une donnée de n'importe quel type, pour autant qu'elle soit non modifiable.

Définition d'un dictionnaire

On peut créer un dictionnaire en listant toutes ses paires clé-valeur, séparées par des virgules, et en délimitant le tout avec des accolades. L'exemple ci-dessous crée un dictionnaire contenant trois paires stockant les numéros de téléphone internes des employés d'une entreprise :

Un dictionnaire vide se déclare avec des accolades vides ({}). L'accès aux éléments d'un dictionnaire se fait également avec des crochets, comme pour les séquences, si ce n'est que l'on utilise la clé de l'élément qui nous intéresse comme indice. La plupart des opérations applicables aux séquences le sont également aux dictionnaires, comme le montre l'exemple suivant :

Comme on peut le constater sur le résultat de l'exécution, la variable phone est bien un dictionnaire puisque son type est dict :

{'Jonathan': 4872, 'Quentin': 8723, 'Cédric': 2837}
3
2837
True
<class 'dict'>

Jonathan : 4872
Quentin : 8723

Contrairement aux séquences, où l'opérateur in agit sur ses éléments, il permet, dans un dictionnaire, de tester si une valeur est une clé de ce dernier. La boucle for agit également sur les clés, permettant de les parcourir. On se rend également compte qu'un dictionnaire est modifiable puisqu'on peut notamment appliquer l'opérateur del.

Enfin, un dictionnaire est bel et bien un ensemble, et non pas une séquence. Du coup, ses éléments, qui sont des paires clé-valeur, ne sont pas ordonnés. Il n'y a dès lors aucune garantie que deux parcours de ses clés se fassent toujours dans le même ordre.

On peut également créer un dictionnaire par compréhension, tout comme on peut le faire pour les séquences et les ensembles. Créons, par exemple, un dictionnaire associant à chaque entier impair compris entre $1$ et $10$ (les clés), son carré (les valeurs) :

On constate bien que les clés du dictionnaire squares sont les entiers impairs voulus, et que les valeurs associés sont à chaque fois leur carré :

{1: 1, 3: 9, 9: 81, 5: 25, 7: 49}

Enfin, on peut également créer un dictionnaire à partir d'une liste de paires clé-valeur, représentées par des tuples. Pour cela, on passe par la fonction dict :

Puisqu'un dictionnaire ne peut pas contenir plusieurs fois la même clé, en cas de doublons, seule la dernière présente dans la liste sera retenue. Comme on a deux fois la clé pear dans la liste passée en paramètre à la fonction dict, seule la valeur associée à la dernière sera retenue, à savoir $1.0$. C'est bien ce que l'on observe sur le résultat de l'exécution :

{'lemon': 0.85, 'pear': 1.0}

Modification d'un dictionnaire

Le dictionnaire est un type modifiable, c'est-à-dire que l'on va pouvoir modifier les valeurs des paires clé-valeur qu'il contient, mais également lui ajouter ou retirer de telles paires. Modifier la valeur d'une paire se fait comme avec les listes, c'est-à-dire avec les crochets en précisant la clé de la paire que l'on veut modifier. Ainsi, pour changer le prix des citrons, on écrit l'instruction suivante :

Si la clé que l'on avait spécifiée dans l'instruction précédente n'existait pas dans le dictionnaire, une nouvelle paire clé-valeur aurait été ajoutée. C'est donc ainsi que l'on ajoute un élément à un dictionnaire :

Cette instruction a donc ajouté une nouvelle paire dont la clé est 'apple' et la valeur est $1.00$, comme on peut le constater sur le résultat de l'exécution :

{'pear': 1.0, 'lemon': 0.9, 'apple': 1.0}

Pour supprimer un élément du dictionnaire, comme on l'a précédemment vu, il suffit d'utiliser la fonction del. Par exemple, pour supprimer la paire correspondant aux poires, on écrit :

Parcours d'un dictionnaire

Il existe plusieurs manières de parcourir un dictionnaire. Comme on a vu en début de section, on peut utiliser la boucle for qui va parcourir ses différentes clés. On accède ensuite aux valeurs associées aux clés avec les crochets :

L'exécution de cette boucle affiche le résultat suivant :

Rappelez-vous bien que l'ordre n'est pas déterminé et peut donc être différent entre deux exécutions, puisqu'un dictionnaire est un ensemble.

On peut récupérer toutes les clés d'un dictionnaire grâce à la fonction keys et tous ses éléments grâce à la fonction items, toutes deux à appliquer sur le dictionnaire duquel on veut extraire les informations. Ces deux fonctions renvoient respectivement des données de type dict_keys et dict_items. Ce sont des séquences que l'on peut transformer en listes avec la fonction list. L'exemple suivant et son résultat illustrent cela :

dict_keys(['apple', 'lemon'])
dict_items([('apple', 1.0), ('lemon', 0.9)])

['apple', 'lemon']
[('apple', 1.0), ('lemon', 0.9)]

Enfin, on peut également directement parcourir les paires d'un dictionnaire en utilisant la fonction items :

Dictionnaire et tuple nommé

Un dictionnaire ressemble à un tuple nommé pour certains points, mais il s'agit bel et bien de deux types de données différents. Voici les différences entre ces deux types :

  • un tuple nommé est une séquence et ses éléments sont donc ordonnés, ce qui n'est pas le cas d'un dictionnaire qui est un ensemble de paires ;
  • un tuple nommé est non modifiable alors que le dictionnaire l'est ;
  • les attributs d'un tuple nommé doivent être des chaines de caractères alors que les clés d'un dictionnaire peuvent être n'importe quelle donnée non modifiable.