Dict : Type associatif
Essayons d'écrire un petit programme d'annuaire :
- On peut renseigner un nouveau contact en donnant son nom et son adresse mail.
- On peut consulter l'adresse mail d'un contact en donnant son nom.
- Si on renseigne un contact déjà enregistré, son adresse mail est mise à jour mais un nouveau contact n'est pas créé.
Un problème dans les séquences...
Activité
Expliquez comment faire un tel programme avec des types séquences.
Expliquez également pourquoi cette solution pose problème.
EXPOSEZ VOS REPONSES A VOTRE PROF
L'annuaire comme une liste de paires :
[ ("Félix", "unmail@unboite.com"), ("Julie", "unautremail@uneautreboite.com"), ("Mathilde", "mathilde@uneboite.com"), ("NOM", "MAIL"), ...]
Mais cette solution rends tout très compliqué :
Pour savoir l'adresse de Félix, il faut chercher Félix dans la liste !
Si on veut ajouter un contact, il faut d'abord le chercher pour vérifier qu'il n'est pas déjà dans la liste, sinon il faut le mettre à jour et non l'ajouter.
Heureusement, Python a une solution très pratique pour ça !
Dict : type associatif
Python propose un type, dict, ou dictionnaire, spécialisé dans les associations par paires.
On construit un dictionnaire en spécifiant des paires, entre {} :
Dans une paire, par exemple
On dit que"Félix" est la clé et que "f@mail.com" est la valeur.
On peut très facilement tester si une clé est dans un dictionnaire avec l'opérateur in :
Si la clé est dans le dictionnaire, on peut retrouver la valeur qui lui est associée avec l'opérateur [] :
On peut ajouter une nouvelle paire dans le dictionnaire de la manière suivante :
Si la clé est déjà présente dans le dictionnaire, alors la valeur associée est mise à jour :
un_dico = {"Félix" : "f@mail.com"}
print(un_dico["Félix"]) #affiche f@mail.com
un_dico["Felix"] = "felfel@mail.fr"
print(un_dico["Félix"]) #affiche felfel@mail.fr
Donc, les clés dans un dictionnaire sont uniques : il ne peux y avoir qu'une seule clé avec une valeur donnée.
Activité
Implémentez un programme qui :
- Propose à l'utilisateur de renseigner des contacts tant qu'il ne rentre pas une chaine vide.
- Propose ensuite à l'utilisateur de retrouver le mail d'un contact à partir de son nom, encore et encore, tant qu'il ne rentre pas une chaîne vide.
TODO : ajouter solution
On peut parcourir les clés d'un dictionnaire avec un for ... in ...:
Activité
Modifiez le programme de l'activité précédente pour que si l'utilisateur se trompe demande l'adresse d'un contact qui n'existe pas, la liste des contacts lui soit affichée.
TODO : ajouter solution
Usages et typages
Le dictionnaire a deux utilités.
La première est celle que nous avons vue dans la section précédente : enregistrer un nombre indéterminé de paires, où toutes les clés ont le même type et la même signification, et toutes les valeurs le même type et la même signification. Il remplace donc une liste de paires. Par exemple :
La seconde est de donner du sens à des valeurs en nombre fixe, comme nous avions vu pour les tuples. Dans ce cas là, les clés sont des chaînes de caractère qui donnent le sens de leur valeurs associées, et les valeurs peuvent avoir n'importe quels types :
personne = {
"nom" : "Bertoni", #type : str
"prénom" : "Félix", #type : str
"age" : 29, #type int
"niveau" : 200, #type int
"diplomes" : ["BAC", "DUT", "Ingenieur", "DIU"] #type list[str]
}
Activité
TODO ajouter activité ici : ptet ajouter des info supplémentaire dans le dico ?
Extension : dispatching dynamique
Les dictionnaires sont un outils extrêmement puissant.
Parfois, une série de if...else peut être remplacée par un simple dictionnaire.
C'est le cas dans calculatrice que vous avez implémentée dans un chapitre antérieur.
TODO continuer ici