Aller au contenu

14b Cours Dictionnaires

Introduction⚓︎

Dans un tableau (ou une liste, en Python), on accède à chaque valeur à partir de son indice :
listeNoms = ["Abel", "Lila", "Chris"]
l'indice \(0\) nous permet d'accéder à la valeur "Abel" en appelant listeNoms[0].

Imaginons maintenant que l'on veuille sauvegarder un annuaire téléphonique :
"Abel" -> "0655555501"
"Lila" -> "0655555505"
"Chris" -> "0655555508"

On pourrait créer une liste de tuples :
annuaire = [("Abel", "0655555501"), ("Lila", "0655555505"), ("Chris", "0655555508")]

L'inconvénient est alors que chaque fois que l'on veut trouver le numéro de téléphone d'une personne, il faut parcourir toute la liste, comparer le premier élément du tuple (le nom) avec celui que l'on cherche, puis récupérer le numéro de téléphone.

Dictionnaire⚓︎

Il existe une autre structure appelée dictionnaire, qui associe des clés à des valeurs. Ici les clés sont les noms, les valeurs sont les numéros de téléphone.

annuaire_dico = {"Abel": "0655555501", "Lila": "0655555505", "Chris": "0655555508"}

Dans un dictionnaire (au sens traditionnel), les mots sont les clés et les définitions les valeurs.

L’accès à la valeur (à partir de la clé) ainsi que la modification ou l’ajout d’une valeur doivent être possibles sans parcourir toute la structure. On parle aussi de tableaux associatifs.

Un dictionnaire est ainsi un ensemble non ordonné de couples (clé, valeur) ou clé: valeur. Un dictionnaire Python est un objet mutable (comme les listes mais contrairement aux chaînes de caractères ou aux tuples).

Performance⚓︎

Accéder et modifier une paire est beaucoup plus rapide dans un dictionnaire que dans une liste de tuples : dans une liste on doit la parcourir pour trouver l’élément alors que dans un dictionnaire on y accède directement.

Les valeurs sont effectivement stockées dans une liste. Et une fonction de hachage permet de mettre en correspondance chaque clé et l’indice de sa valeur dans la liste stockant les valeurs. La fonction de hachage dépend du type de la clé, mais dans tous les cas, elle donne un identificateur (valeur de hachage) idéalement unique pour la clé. Ensuite l’identificateur est converti en indice dans la liste des valeurs du dictionnaire.

La table de hachage prend de la place en mémoire. On choisit donc entre dictionnaire et liste en fonction du compromis souhaité entre performance et espace mémoire.

Création de dictionnaires⚓︎

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

Dictionnaire vide⚓︎

🐍 Script Python
d = dict()

# ou

d = {}


print(d)
📋 Texte
{}

En listant les couples, entre accolades⚓︎

🐍 Script Python
boxoffice = {'Aladdin' : 569439,
             'Godzilla 2' : 342574,
             'Rocketman' : 277017}


print(boxoffice)
📋 Texte
{'Aladdin': 569439, 'Godzilla 2': 342574, 'Rocketman': 277017}

Par compréhension de dictionnaire⚓︎

🐍 Script Python
dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

double_dict1 = {k: v * 2 for (k, v) in dict1.items()}

print(double_dict1)
📋 Texte
{'a': 2, 'b': 4, 'c': 6, 'd': 8, 'e': 10}

Accès aux valeurs, informations⚓︎

Accès à une valeur par sa clé⚓︎

🐍 Script Python
print(boxoffice['Aladdin'])
📋 Texte
569439

Nombre d’enregistrements (longueur)⚓︎

🐍 Script Python
print(len(boxoffice) == 3)
📋 Texte
True

Test d’appartenance d’une clé⚓︎

🐍 Script Python
print('Rocketman' in boxoffice)
📋 Texte
True

Ajout, modification, suppression de valeurs⚓︎

Ajout d’une valeur⚓︎

🐍 Script Python
boxoffice['Avengers'] = 0

print(len(boxoffice) == 4)
print(boxoffice['Avengers'])
📋 Texte
True
0

Lorsqu'on ajoute un couple (clé, valeur), si la clé figure déjà dans le dictionnaire alors le couple est remplacé par le nouveau.

Unicité des clés⚓︎

🐍 Script Python
boxoffice['Avengers'] = 132260

print(len(boxoffice) == 4)
print(boxoffice['Avengers'])
📋 Texte
True
132260

Les valeurs peuvent ne pas être uniques⚓︎

🐍 Script Python
boxoffice['Mon Film'] = 132260

print(len(boxoffice) == 5)
print(boxoffice['Avengers'])
print(boxoffice['Mon Film'])
📋 Texte
True
132260
132260

Supprimer une valeur⚓︎

🐍 Script Python
del boxoffice['Mon Film']

print(len(boxoffice) == 4)
print('Mon Film' in boxoffice )
📋 Texte
True
False

Itérations⚓︎

Itération sur les clés⚓︎

🐍 Script Python
for film in boxoffice:
    print(f"{film} => {boxoffice[film]} spectateurs")
📋 Texte
Aladdin => 569439 spectateurs
Godzilla 2 => 342574 spectateurs
Rocketman => 277017 spectateurs
Avengers => 132260 spectateurs

On obtient le même résultat avec le code ci-dessous :

🐍 Script Python
for film in boxoffice.keys():
    print(f"{film} => {boxoffice[film]} spectateurs")
📋 Texte
Aladdin => 569439 spectateurs
Godzilla 2 => 342574 spectateurs
Rocketman => 277017 spectateurs
Avengers => 132260 spectateurs

Itération sur les valeurs⚓︎

🐍 Script Python
for nbre_spectateurs in boxoffice.values():
    print(nbre_spectateurs)
📋 Texte
569439
342574
277017
132260

Itération sur les paires (clé, valeur)⚓︎

🐍 Script Python
for film, nbre_spectateurs in boxoffice.items():
    print(f"{film} => {nbre_spectateurs} spectateurs")
📋 Texte
Aladdin => 569439 spectateurs
Godzilla 2 => 342574 spectateurs
Rocketman => 277017 spectateurs
Avengers => 132260 spectateurs

Exceptions⚓︎

Accès à une valeur inexistante⚓︎

🐍 Script Python
print(boxoffice['Mon Film'])
📋 Texte
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    print(boxoffice['Mon Film'])
KeyError: 'Mon Film'

Capture d’exceptions⚓︎

🐍 Script Python
def nombre_entrees(titre_film):
    '''
    renvoie le nombre d'entrées du film selon boxoffice, 0 si nombre non connnu
    (boxoffice considéré ici comme global)
    '''
    try:
        return boxoffice[titre_film]
    except KeyError:
        return 0

print(nombre_entrees('Avengers'))
print(nombre_entrees('Mon film'))
📋 Texte
132260
0

La méthode get() permet d’accéder à la valeur d’une clef⚓︎

🐍 Script Python
print(boxoffice.get('Avengers'))
📋 Texte
132260
  • boxoffice.get(key) est équivalent boxoffice[key] si key est une clef qui existe
  • boxoffice.get(key) renvoie None par défaut en cas de clef absente
🐍 Script Python
print(boxoffice.get('Mon Film') == None)

# On peut préciser, en second paramètre, la valeur que l'on veut avoir pour une clef absente
print(boxoffice.get('Mon Film', 0))
print(boxoffice.get('Avengers', 0))
📋 Texte
True
0
132260

Type des clés et valeurs⚓︎

Les clés peuvent être de différents types (mais non mutables)⚓︎

Ni les listes, ni les dictionnaires ne peuvent servir de clés. Par contre, les nombres (entiers ou flottants), les chaînes de caractères, les tuples, etc. le peuvent.

🐍 Script Python
chiffres_arabes_vers_romains = {1: 'I', 10: 'X', 100: 'C'}
print(chiffres_arabes_vers_romains[10])
📋 Texte
X
🐍 Script Python
grille = {(0,0): 'T', (0,1): 'S', (1,0): ' ', (1,1): 'T'}
print(grille[(0,0)] == 'T')
📋 Texte
True

Ce code provoque une erreur :

🐍 Script Python
d1 = {'s': 3, 8: 'chat', [1, 'chien']: (2, 7)}
print(d1)
📋 Texte
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    d1 = {'s': 3, 8: 'chat', [1, 'chien']: (2, 7)}
TypeError: unhashable type: 'list'

Pas celui-ci :

🐍 Script Python
d2 = {'s': 3, 8: 'chat', (1, 'chien'): (2, 7)}
print(d2)
📋 Texte
{'s': 3, 8: 'chat', (1, 'chien'): (2, 7)}

Les valeurs peuvent être de n’importe quel type⚓︎

🐍 Script Python
thon = {'espece': 'T', 'gestation': 3}
requin = {'espece': 'S', 'gestation': 2, 'energie': 2}
mer = {(0, 0): thon, (0, 1): None, (1, 0): None, (1, 1): requin}

print(mer[(0, 0)]['espece'])
print(mer[(1, 1)]['energie'])
📋 Texte
T
2