Python - Dictionnaires
[Mise à jour le : 16/8/2022]
- Sources
- Lectures connexes
- Real Python
- Mots-clés : dictionnaire, parcours de dictionnaires.
and | continue | finally | is | raise |
as | def | for | lambda | return |
assert | del | from | None | True |
async | elif | global | nonlocal | try |
await | else | if | not | while |
break | except | import | or | with |
class | False | in | pass | yield |
- Fonctions natives (built-in)1) utilisées dans les exemples : dict()2), del(), print(), range(), zip().
1. Introduction
Le dictionnaire est une implémentation de table de hash. Il permet l'accès, l'insertion et le test d'appartenance indépendamment du nombre d'éléments. Le dictionnaire est un objet conteneur. À la différence des séquences, qui sont indexées par des nombres, les dictionnaires sont indexés par des clés, qui peuvent être de n'importe quel type immuable ; les chaînes de caractères et les nombres peuvent toujours être des clés.
2. Création
Exemples
- *.py
# Première méthode dico = {} # dictionnaire vide dico = {'nom':'Martin','prenom':'Pierre-Emile'} # création en extension print(dico) # Résultat : {'nom': 'Martin', 'prenom': 'Pierre-Emile'} # Deuxième méthode dico = dict() # dictionnaire vide # La fonction native dict() construit un dictionnaire directement à partir d'une liste # de paires clé-valeur stockées sous la forme de tuples. dico = dict([('nom','Martin'),('prenom','Pierre-Emile')]) print(dico) # Résultat : {'nom': 'Martin', 'prenom': 'Pierre-Emile'} # ou # Construction à partir d'une liste de tuples et de la fonction native dict() l = [('nom','Martin'),('prenom','Pierre-Emile')] dico = dict(l) print(dico) # Résultat : {'nom': 'Martin', 'prenom': 'Pierre-Emile'} # Troisième méthode dico = dict(nom='Martin',prenom='Pierre-Emile') print(dico) # Résultat : {'nom': 'Martin', 'prenom': 'Pierre-Emile'}
3. Lecture de la valeur d'un élément
On accède à une valeur à partir de sa clé par nom_dictionnaire[clé]. Si la clé n'existe pas, une exception de type KeyError sera levée.
Exemple
- *.py
# En faisant un test d'appartenance on évite la génération d'une erreur KeyError si la clé est absente if 'nom' in dico: print(dico["nom"]) # résultat : Martin
4. Ajout ou modification d'un élément
Exemples
- *.py
dico = {} # La clé peut être une chaîne de caractères dico['nom']='Martin' dico['prenom']='Pierre-Emile' print(dico) #résultat : {'nom': 'Martin', 'prenom': 'Pierre-Emile'} # La clé peut être un tuple echiquier = {} echiquier[('a',1)] = 'tour blanche' print(echiquier) # résultat : {('a', 1): 'tour blanche'}
5. Suppression d'éléments
- *.py
placard = {"chemise":6,"pantalon":4} del(placard["chemise"]) print(placard) # Résultat : {'pantalon': 4} n = placard.pop("pantalon") print(placard) # Résultat : {} print(n,"pantalon(s) donné(s)") # Résultat : 4 pantalon(s) donné(s)
6. Le parcours de dictionnaires
La méthode la plus fréquente pour parcourir tout un dictionnaire est à base de la méthode items.
6.1 Parcours des clés et valeurs simultanément
- *.py
placard = {"chemise": 6, "pantalon": 4, "chaussette": 10, "pull": 4} # A chaque tour de boucle, items renvoie un tuple constitué de la clé et de la valeur for cle, valeur in placard.items(): # notation de tuple unpacking print(cle, valeur) # Résultat chemise 6 pantalon 4 chaussette 10 pull 4
On peut obtenir séparément la liste des clés et des valeurs.
6.2 Parcours des clés
- *.py
placard = {"chemise": 6, "pantalon": 4, "chaussette": 10, "pull": 4} for cle in placard.keys(): print(cle) # Résultat chemise pantalon chaussette pull
Exemple
- *.py
# Dans l'exemple précédent, on obtient le même résultat san préciser la méthode keys() placard = {"chemise": 6, "pantalon": 4, "chaussette": 10, "pull": 4} for cle in placard: print(cle) # Résultat chemise pantalon chaussette pull
6.3 Parcours des valeurs
- *.py
placard = {"chemise": 6, "pantalon": 4, "chaussette": 10, "pull": 4} for valeur in placard.values(): print(valeur) # Résultat 6 4 10 4
Exemple
- *.py
# Création du dictionnaire en extension placard = {"chemise": 6, "pantalon": 4, "chaussette": 10, "pull": 4} k = placard.keys() # Création d'une "vue" sur le dictionnaire placard print(k) # Résultat : dict_keys(['chemise', 'pantalon', 'chaussette', 'pull']) placard['short'] = 3 # Ajout d'un couple dans le dictionnaire placard print(placard) # Résultat : {'chemise': 6, 'pantalon': 4, 'chaussette': 10, 'pull': 4, 'short': 3} # La vue a été modifiée sans réaffectation print(k) # Résultat : dict_keys(['chemise', 'pantalon', 'chaussette', 'pull', 'short']) # Test d'appartenance sur une vue 'chemise' in k # Résultat : True 'ceinture in k # Résultat : False
7. Formation d'un dictionnaire à partir de deux listes
Exemples
- *.py
# Formation du dictionnaire dico à partir de deux listes cles=['a','b','c'] valeurs=[1,2,3] dico=dict(zip(cles,valeurs)) # Affichage print(dico) # résultat : {'a': 1, 'b': 2, 'c': 3}
8. Transformation d'un dictionnaire en paramètres nommés d'une fonction
Exemple
- *.py
parametres = {"sep" : " >> ", "end" : " -\n"} print("Voici", "un", "exemple", "d'appel", **parametres) # Résultat : Voici >> un >> exemple >> d'appel -
9. Gérer des enregistrements
Un enregistrement est une donnée composite qui contient plusieurs champs (struct ou un record dans d'autres langages).
9.1 Implémenter un enregistrement comme un dictionnaire
Exemple
- *.py
# Enregistrement personnes = [ {'nom': 'Pierre', 'age': 25, 'email': 'pierre@example.com'}, {'nom': 'Paul', 'age': 18, 'email': 'paul@example.com'}, {'nom': 'Jacques', 'age': 52, 'email': 'jacques@example.com'}, ] # Pour l'anniversaire de Pierre on fera : personnes[0]['age'] += 1 # Affichage for personne in personnes: print(10*"=") for info, valeur in personne.items(): print(f"{info} -> {valeur}") # Résultat # ========== # nom -> Pierre # age -> 26 # email -> pierre@example.com # ========== # nom -> Paul # age -> 18 # email -> paul@example.com # ========== # nom -> Jacques # age -> 52 # email -> jacques@example.com
9.2 Un dictionnaire pour indexer les enregistrements
Exemple
- *.py
personnes = [ {'nom': 'Pierre', 'age': 25, 'email': 'pierre@example.com'}, {'nom': 'Paul', 'age': 18, 'email': 'paul@example.com'}, {'nom': 'Jacques', 'age': 52, 'email': 'jacques@example.com'}, ] # on crée un index permettant de retrouver rapidement une personne dans la liste index_par_nom = {personne['nom']: personne for personne in personnes} index_par_nom # Résultat : {'Pierre': {'nom': 'Pierre', 'age': 26, 'email': 'pierre@example.com'}, # 'Paul': {'nom': 'Paul', 'age': 18, 'email': 'paul@example.com'}, # 'Jacques': {'nom': 'Jacques', 'age': 52, 'email': 'jacques@example.com'}} # On accède à l'age de Pierre par index_par_nom['Pierre']['age'] # Résultat : 26 # au lieu de personnes[0]['age'], ce qui est plus pertinent car un dictionnaire n'est pas ordonné
9. Les méthodes de la classe dict
- Source w3schools.com
Fonction | Paramètres | Effet | Structure |
---|---|---|---|
clear() | Supprime tous les éléments du dictionnaire. | d.clear() | |
copy() | Renvoie une copie du dictionnaire. | d.copy() | |
fromkeys() | clés,valeur | Crée un dictionnaire à partir d'une liste de clés prenant la même valeur ou None. | d.fromkeys(keys,value) |
get() | clé,defaut | Renvoie la valeur de l'élément avec la clé spécifiée ou la valeur par défaut si celle-ci est absente. | d.get(clé, defaut) |
items() | Renvoie les paires clé-valeur du dictionnaire. | d.items() | |
keys() | Renvoie la liste des clés du dictionnaire. | d.keys() | |
popitem() | Renvoie et supprime le dernier élément du dictionnaire. | d.popitem() | |
pop() | clé | Renvoie et supprime l'élément correspondant à la clé. | d.pop(clé) |
setdefault() | clé,valeur | Renvoie l'élément correspondant à la clé. S'il n'est pas présent, insère la clé avec la valeur dans le dictionnaire. | d.setdefault(clé,valeur) |
update() | iterable | Met à jour le dictionnaire. | d.update(iterable) |
values() | Renvoie les valeurs du dictionnaire . | d.values() |
Résumé
- Un dictionnaire est un objet conteneur associant des clés à des valeurs.
- Pour créer un dictionnaire en extension, on utilise la syntaxe dictionnaire = {clé1:valeur1,clé2:valeur2,clén:valeurn}.
- On ajoute ou on remplace un élément dans un dictionnaire par dictionnaire[clé] = valeur.
- On supprime une clé et sa valeur avec le mot-clé del ou la méthode pop.
- On parcourt un dictionnaire avec les méthodes keys(), values() et items().
- On capture les paramètres nommés passés à une fonction avec la syntaxe def nom_fonction(**parametres_nommes : (les paramètres nommés se trouvent dans le dictionnaire parametres_nommes).