Aller au contenu

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 {} :

un_dico = {
    "Félix" : "f@mail.com",
    "Julie" : "juju38@mail.com",
}

un_dico_vide = {}

Dans une paire, par exemple

"Félix" : "f@mail.com"
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 :

if "Félix" in un_dico:
    # si Félix est dans un_dico...

Si la clé est dans le dictionnaire, on peut retrouver la valeur qui lui est associée avec l'opérateur [] :

mail_felix = un_dico["Félix"]
print(mail_felix) #affiche "f@mail.com"

On peut ajouter une nouvelle paire dans le dictionnaire de la manière suivante :

un_dico["Gérard"] = "tutut@mail.com"

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 ...:

dico = {"a":1, "b":3, "c":2}

for cle in dico : 
    print(cle) #affiche successivement : a, b, et c

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 :

{ NOM : ADRESSE, ...}

{ IDENTIFIANT : NIVEAU, ...}

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