Prenons l'exemple d'un répertoire téléphonique. Nous pouvons la modéliser simplement comme un tableau (ou liste) contenant des tableaux de la forme [nom, numéro]
:
>>> liste_tel = [["Paul", 5234],
["Victor", 5186],
["Rose", 5678],
["Hélène", 5432]]
Si nous voulons appeler Rose, nous avons deux possibilités avec un tel tableau :
>>> liste_tel[2][1] # il faut savoir que l'index de Rose est 2
5678
>>> for element in liste_tel:
if element[0] == 'Rose':
print(element[1])
5678
Vous conviendrez que ce n'est pas pratique pour accéder à son numéro de téléphone. De même, la modification ou l'ajout d'une information nécessiterait de devoir feuilleter tout le répertoire. Il semblerait plus pratique d'associer un numéro à un nom, c'est ce que les dictionnaires vont permettre !
Un dictionnaire est un ensemble non ordonné de paires (clé, valeur). On peut accéder à une valeur à partir de sa clé, et cet accès est très rapide.
Le répertoire téléphonique précédent peut se mémoriser dans le dictionnaire repertoire
suivant :
repertoire = {'Paul': 5234, 'Victor': 5186, 'Rose': 5678, 'Hélène': 5432}
Analyse :
{}
.clé: valeur
. Dans cet exemple :
5234
est associée à la clé 'Paul'
5186
est associée à la clé 'Victor'
Dans ce cas, on dit qu'on a créé le dictionnaire par extension.
On dit qu'un dictionnaire n'est pas ordonné car l'ordre des paires (clé, valeur) n'a aucune importance. Ainsi, les deux dictionnaires
d1
etd2
suivants sont considérés comme égaux.>>> d1 = {'a': 2, 'b': 5} >>> d2 = {'b': 5, 'a': 2} >>> d1 == d2 True
En Python, un dictionnaire est un objet de type dict
:
>>> type(repertoire)
dict
Écrivez les instructions permettant de répondre aux questions suivantes.
notes
qui contient les paires (matières, moyenne) de vos trois spécialités. Remarques importantes :
Par exemple, le dictionnaire suivant est tout à fait correct (essayez de repérer les clés et les valeurs associées, ainsi que leurs types respectifs) :
{1: 'deux', 'trois': [4, 5, 6], 'sept': {8: 9, 10: 'onze'}, 12: 13}
En Python, le dictionnaire est un objet mutable, autrement dit, on peut le modifier (comme nous allons le voir dans le paragraphe suivant)
L'accès à une valeur d'un dictionnaire se fait par sa clé :
>>> repertoire = {'Paul': 5234, 'Victor': 5186, 'Rose': 5678, 'Hélène': 5432}
>>> repertoire['Rose']
5678
>>> fruits = {'poires': 5, 'bananes': 7, 'abricots' : 12}
>>> fruits['abricots']
12
Analyse : Pour accéder à une valeur d'un dictionnaire, on utilise les crochets et on y indique à l'intérieur la clé correspondante.
Vous noterez que c'est beaucoup plus pratique que ce qu'on a vu en introduction.
Le dictionnaire étant un objet mutable on peut modifier la valeur associée à une clé ou ajouter une nouvelle association et afficher le dictionnaire modifié.
>>> repertoire = {'Paul': 5234, 'Victor': 5186, 'Rose': 5678, 'Hélène': 5432}
>>> repertoire['Rose'] = 4921 # clé existante donc modification de la valeur
>>> repertoire
{'Paul': 5234, 'Victor': 5186, 'Rose': 4921, 'Hélène': 5432}
>>> repertoire['Louane'] = 4118 # nouvelle clé donc ajout d'une nouvelle association
>>> repertoire
{'Paul': 5234, 'Victor': 5186, 'Rose': 4921, 'Hélène': 5432, 'Louane': 4118}
Si on essaie d'accéder à une clé qui n'existe pas, une erreur de type KeyError
(erreur de clé) est levée :
>>> repertoire['Kylian']
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
KeyError: 'Kylian'
Pour supprimer une association d'un dictionnaire on peut utilise le mot clé del
.
>>> repertoire
{'Paul': 5234, 'Victor': 5186, 'Rose': 4921, 'Hélène': 5432, 'Louane': 4118}
>>> del repertoire['Paul']
>>> repertoire
{'Victor': 5186, 'Rose': 4921, 'Hélène': 5432, 'Louane': 4118}
La fonction len
renvoie la taille d'un dictionnaire.
>>> repertoire = {'Paul': 5234, 'Victor': 5186, 'Rose': 5678, 'Hélène': 5432}
>>> len(repertoire)
4
>>> fruits = {'poires': 5, 'bananes': 7, 'abricots' : 12}
>>> len(fruits)
3
On reprend le dictionnaire notes
de l'exercice 1. Écrivez les instructions permettant de répondre aux questions suivantes.
Pour créer un dictionnaire vide on peut procéder ainsi :
>>> d1 = {} # création d'un dictionnaire vide
>>> d1
{}
>>> d2 = dict() # création d'un dictionnaire vide (autre méthode)
>>> d2
{}
On peut aussi créer un dictionnaire par compréhension :
>>> d3 = {k: k**2 for k in range(1, 10)} # création d'un dictionnaire par compréhension
>>> d3
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Analyse : on a ici créé un dictionnaire dont les clés sont égales à k
et leurs valeurs associées égales à k**2
, pour k
allant de 1 à 9.
Il est même possible de créer un dictionnaire à partir d'une liste de couples en le convertissant avec la fonction dict()
.
>>> liste = [('cle1', 'valeur1'),('cle2', 'valeur2')]
>>> d4 = dict(liste)
>>> d4
{'cle1': 'valeur1', 'cle2': 'valeur2'}
>>> liste_tel = [["Paul", 5234], ["Victor", 5186], ["Rose", 5678], ["Hélène", 5432]]
>>> d5 = dict(liste_tel)
>>> d5
{'Paul': 5234, 'Victor': 5186, 'Rose': 5678, 'Hélène': 5432}
Il est possible de parcourir un dictionnaire de trois manières :
keys()
;values()
;items()
.>>> repertoire = {'Paul': 5234, 'Victor': 5186, 'Rose': 5678, 'Hélène': 5432}
>>> for prenom in repertoire.keys():
print(prenom)
Paul
Victor
Rose
Hélène
>>> for num in repertoire.values():
print(num)
5234
5186
5678
5432
>>> for prenom, num in repertoire.items():
print(prenom, '->', num)
Paul -> 5234
Victor -> 5186
Rose -> 5678
Hélène -> 5432
On peut aussi interroger l'appartenance d'une valeur ou d'une clé grâce au mot clé in
.
>>> 'John' in repertoire.keys()
False
>>> 'Rose' in repertoire.keys()
True
>>> 'Victor' not in repertoire.keys()
False
>>> 5186 in repertoire.values()
True
On considère le dictionnaire fruits
suivant. Écrivez les instructions permettant de répondre aux questions suivantes.
fruits = {'poires': 5, 'pommes': 11, 'bananes': 7, 'abricots' : 12}
Il reste 5 poires
Il reste 11 pommes
Il reste 7 bananes
Il reste 12 abricots
Références :
Germain BECKER & Sébastien POINT, Lycée Mounier, ANGERS