Dictionnaires

Les dictionnaires ont déjà été étudiés en classe de première. Pour rappel, ce type de données, aussi appelé tableau associatif, permet de stocker des valeurs et d'y accéder au moyen d'une clé, contrairement au tableau qui permet d'accéder à une donnée au moyen d'un indice.

Exemple

Voici ce à quoi ressemble l'utilisation d'un dictionaire en python :

dico = dict()
dico["Nom"] = "Aldébaran"
dico["Prenom"] = "Andjekel"

print( dico["Prenom"] + " " + dico["Nom"])

Dans cet exemple, les clés sont les chaînes "Nom" et "Prenom". On affiche ensuite leurs valeurs.

Opérations classiques sur les dictionnaires

Les opérations classiques que l'on peut effectuer sur un dictionnaire sont :

  • Ajouter une nouvelle entrée au dictionnaire en créant une nouvelle clé
  • Modifier la valeur associée à une clé existante
  • Suprimer une entrée dans un dictionnaire (méthode .pop())
  • Rechercher la présence d'une clé dans un dictionnaire.

La recherche dans un dictionnaire est optimisée pour s'effectuer sur les clés et non sur les valeurs. Par exemple avec le dictionnaire que nous avons créé précédemment, la commande "Nom" in dico renverra True alors que "Aldébaran" in dico renverra False.

Dans un dictionnaire, les clés et les valeurs ne jouent donc pas du tout le même rôle et ne sont pas interchangeables.

Les clés

Une clé peut être d'un autre type que chaîne de caractère, du moment que c'est un objet non mutable, c'est à dire qui ne peut pas être modifié. Une clé ne peut pas être une liste par exemple car une liste est un objet mutable que l'on peut modifier, par exemple au travers de la méthode .append().

Regardons ce qui se passe si on essaye de définir une clé de type list pour un dicitonnaire :

 dico[[2,1]] = "..."
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-d463baccae6e> in <module>()
----> 1 dico[[2,1]]

TypeError: unhashable type: 'list'

Le type list n'est pas pas hashable. Mais qu'est-ce que le hachage ?

Hachage

La notion de Hachage est omiprésente en informatique et est au coeur du fonctionnement des dictionnaires. Le hachage est un mécanisme permettant de transformer la clé en un nombre unique permettant l'accès à la donnée, un peu à la manière d'un indice dans un tableau.

Définition d'une fonction de hachage

Une fonction de hachage est une fonction qui va calculer une empreinte unique à partir de la donnée fournie en entrée. Elle doit respecter les règles suivantes :

  • La longueur de l'empreinte (valeur retournée par la fonction de hachage) doit être toujours la même, indépendamment de la donnée fournie en entrée.
  • Conaissant l'empreinte, il ne doit pas être possible de reconstituer la donnée d'origine
  • des données différentes doivent donner dans la mesure du possible des empreintes différentes.
  • des données identiques doivent donner des empreintes identiques.

Quelques utilisations du hachage

L'utilisation la plus courante est le stockage des mots de passe dans un système informatique un peu sécurisé. En effet, lorsqu'on crée un compte sur un service en ligne, le mot de passe ne doit pas être stocké en clair, une empreinte est générée afin que si le service est piraté et que les comptes sont dérobés, il ne soit pas possible de reconstituer le mot de passe à partir de l'empreinte. Voici un exemple de fonctionnement d'une fonction de hachage.
Nous utiliserons le hachage accessible sous Python au travers de la fonction hash() :

>>> hash("Aldébaran")
7932194494807972993

>>> hash("Aldebaran") -2778791670536604289
>>> hash("Andjekel Aldébaran") -8861304277632426640

On constate bien sur cet exemple que :

  • toutes les empreintes ont la même longueur
  • un petit changement dans la valeur d'entrée fournit une empreinte totalement différentes

Une autre utilisation du hachage est la détection de la modification d'un fichier.

Ainsi la fonction de hachage peut mettre en évidence des différences qui seraient invisibles à l'oeil nu.

Table de Hachage

Regardez la vidéo ci-dessous sur les tables de hachage.

Ce qui est important à retenir c'est que la recherche dans une table de hachage est indépendante du nombre d'éléments dans cette table.
Dans un tableau ou une liste chaînée au contraire, la recherche d'un élément prend un temps proportionnel au nombre d'éléments dans la structure.

Dans un dictionnaire, les clés sont stockées dans une table de hachage, ce qui explique le fait que le dictionnaire est optimisé pour la recherche sur les clés.

Nous allons vérifier cela en pratique dans un TP.Les dictionnaires TP

utilisation des dictionnaires en Python

Vous pouvez à présent regarder la vidéo suivante afin de vous reviser la manipulation des dictionnaires en python avant de passer aux travaux pratiques.