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⚓︎
d = dict()
# ou
d = {}
print(d)
{}
En listant les couples, entre accolades⚓︎
boxoffice = {'Aladdin' : 569439,
'Godzilla 2' : 342574,
'Rocketman' : 277017}
print(boxoffice)
{'Aladdin': 569439, 'Godzilla 2': 342574, 'Rocketman': 277017}
Par compréhension de dictionnaire⚓︎
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)
{'a': 2, 'b': 4, 'c': 6, 'd': 8, 'e': 10}
Accès aux valeurs, informations⚓︎
Accès à une valeur par sa clé⚓︎
print(boxoffice['Aladdin'])
569439
Nombre d’enregistrements (longueur)⚓︎
print(len(boxoffice) == 3)
True
Test d’appartenance d’une clé⚓︎
print('Rocketman' in boxoffice)
True
Ajout, modification, suppression de valeurs⚓︎
Ajout d’une valeur⚓︎
boxoffice['Avengers'] = 0
print(len(boxoffice) == 4)
print(boxoffice['Avengers'])
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⚓︎
boxoffice['Avengers'] = 132260
print(len(boxoffice) == 4)
print(boxoffice['Avengers'])
True
132260
Les valeurs peuvent ne pas être uniques⚓︎
boxoffice['Mon Film'] = 132260
print(len(boxoffice) == 5)
print(boxoffice['Avengers'])
print(boxoffice['Mon Film'])
True
132260
132260
Supprimer une valeur⚓︎
del boxoffice['Mon Film']
print(len(boxoffice) == 4)
print('Mon Film' in boxoffice )
True
False
Itérations⚓︎
Itération sur les clés⚓︎
for film in boxoffice:
print(f"{film} => {boxoffice[film]} spectateurs")
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 :
for film in boxoffice.keys():
print(f"{film} => {boxoffice[film]} spectateurs")
Aladdin => 569439 spectateurs
Godzilla 2 => 342574 spectateurs
Rocketman => 277017 spectateurs
Avengers => 132260 spectateurs
Itération sur les valeurs⚓︎
for nbre_spectateurs in boxoffice.values():
print(nbre_spectateurs)
569439
342574
277017
132260
Itération sur les paires (clé, valeur)⚓︎
for film, nbre_spectateurs in boxoffice.items():
print(f"{film} => {nbre_spectateurs} spectateurs")
Aladdin => 569439 spectateurs
Godzilla 2 => 342574 spectateurs
Rocketman => 277017 spectateurs
Avengers => 132260 spectateurs
Exceptions⚓︎
Accès à une valeur inexistante⚓︎
print(boxoffice['Mon Film'])
Traceback (most recent call last):
File "main.py", line 1, in <module>
print(boxoffice['Mon Film'])
KeyError: 'Mon Film'
Capture d’exceptions⚓︎
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'))
132260
0
La méthode get() permet d’accéder à la valeur d’une clef⚓︎
print(boxoffice.get('Avengers'))
132260
boxoffice.get(key)est équivalentboxoffice[key]sikeyest une clef qui existeboxoffice.get(key)renvoieNonepar défaut en cas de clef absente
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))
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.
chiffres_arabes_vers_romains = {1: 'I', 10: 'X', 100: 'C'}
print(chiffres_arabes_vers_romains[10])
X
grille = {(0,0): 'T', (0,1): 'S', (1,0): ' ', (1,1): 'T'}
print(grille[(0,0)] == 'T')
True
Ce code provoque une erreur :
d1 = {'s': 3, 8: 'chat', [1, 'chien']: (2, 7)}
print(d1)
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 :
d2 = {'s': 3, 8: 'chat', (1, 'chien'): (2, 7)}
print(d2)
{'s': 3, 8: 'chat', (1, 'chien'): (2, 7)}
Les valeurs peuvent être de n’importe quel type⚓︎
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'])
T
2