Les dictionnaires en langage Python#
Le dictionnaire (dict) est sans doute la structure de données la plus puissante et la plus omniprésente en Python. Qu'il s'agisse de manipuler des réponses d'API web (JSON), de configurer des modèles d'apprentissage automatique ou d'organiser des bases de données en mémoire, les dictionnaires permettent d'associer des clés uniques à des valeurs.
Sous le capot, les dictionnaires Python reposent sur une table de hachage (hash table) hautement optimisée, garantissant des opérations d'accès, d'insertion et de recherche en temps quasi-instantané : \(\mathcal{O}(1)\) en moyenne.
1. Création et règles de validité des clés#
Un dictionnaire se définit par une suite de paires clé: valeur entourée d'accolades {...} :
# Dictionnaire vide
vide = {}
vide_constructeur = dict()
# Dictionnaire de profil utilisateur
utilisateur = {
"id": 101,
"nom": "Alice Dubois",
"email": "alice@algojungle.com",
"competences": ["Python", "SQL", "Docker"],
"actif": True
}
La règle d'or des clés : Hachabilité et Immuabilité#
[!IMPORTANT] - Les valeurs peuvent être de n'importe quel type (nombres, chaînes, listes, fonctions, ou même d'autres dictionnaires imbriqués). - Les clés doivent obligatoirement être uniques et immuables (types hachables :
str,int,float,tuple). Une liste[1, 2]ne peut jamais servir de clé sous peine de lever unTypeError: unhashable type: 'list'.
2. Accès aux valeurs : Crochets vs Méthode .get()#
L'accès direct par crochets []#
Accéder à une clé inexistante par crochets lève immédiatement une exception KeyError :
capitale = {"France": "Paris", "Togo": "Lome", "Canada": "Ottawa"}
print(capitale["Togo"]) # "Lome"
# print(capitale["Japon"]) -> Déclenche KeyError: 'Japon'
L'accès sécurisé par la méthode .get()#
La méthode .get(cle, valeur_par_defaut=None) ne plante jamais : elle renvoie None ou une valeur de repli personnalisée si la clé n'existe pas :
# Ne plante pas, renvoie "Inconnue"
capitale_japon = capitale.get("Japon", "Capitale non repertoriee")
print(capitale_japon) # "Capitale non repertoriee"
3. Modification, Ajout et Suppression#
Les dictionnaires sont mutables :
stock = {"pommes": 10, "bananes": 5}
# 1. Ajout ou mise à jour directe
stock["oranges"] = 8 # Clé inexistante -> Insertion
stock["pommes"] = 15 # Clé existante -> Mise à jour de la valeur
# 2. Suppression avec pop() (renvoie la valeur supprimée)
quantite_bananes = stock.pop("bananes")
print(f"Bananes retirees : {quantite_bananes}")
# 3. Suppression avec le mot-clé del
del stock["oranges"]
# 4. Suppression du dernier élément inséré (LIFO)
# k, v = stock.popitem()
Fusion moderne de dictionnaires (Python 3.9+ : Opérateur |)#
Depuis Python 3.9 (PEP 584), vous pouvez fusionner deux dictionnaires avec l'opérateur barre verticale | :
params_defaut = {"theme": "sombre", "langue": "fr", "notifications": True}
params_utilisateur = {"langue": "en", "taille_police": 14}
# Fusion : les clés de droite écrasent celles de gauche
params_finaux = params_defaut | params_utilisateur
print(params_finaux)
# {'theme': 'sombre', 'langue': 'en', 'notifications': True, 'taille_police': 14}
4. Parcourir un dictionnaire : .keys(), .values(), .items()#
Il existe trois façons idiomatiques d'itérer sur un dictionnaire :
prix_fruits = {"pomme": 1.20, "mangue": 2.50, "avocat": 1.80}
# 1. Parcourir les clés uniquement (comportement par défaut)
for fruit in prix_fruits:
print(fruit, end=" ")
print()
# 2. Parcourir les valeurs uniquement avec .values()
for prix in prix_fruits.values():
print(f"{prix} EUR", end=" ")
print()
# 3. Parcourir simultanément les clés et les valeurs avec .items() (RECOMMANDÉ)
for fruit, prix in prix_fruits.items():
print(f"Article : {fruit:<8} | Prix : {prix:>4.2f} EUR")
5. Les compréhensions de dictionnaires (Dict Comprehensions)#
À l'instar des listes, vous pouvez créer ou transformer des dictionnaires de manière déclarative :
# 1. Conversion d'un catalogue de prix HT en TTC (TVA 20%)
prix_ht = {"serveur": 800, "routeur": 150, "cable": 20}
prix_ttc = {k: round(v * 1.20, 2) for k, v in prix_ht.items()}
print(prix_ttc) # {'serveur': 960.0, 'routeur': 180.0, 'cable': 24.0}
# 2. Inverser un dictionnaire (Clés deviennent valeurs)
capitales = {"France": "Paris", "Senegal": "Dakar"}
pays_par_capitale = {v: k for k, v in capitales.items()}
print(pays_par_capitale) # {'Paris': 'France', 'Dakar': 'Senegal'}
6. Mise en pratique : Compteur de fréquences de mots#
Concevons un outil classique d'analyse textuelle (Natural Language Processing) qui compte les occurrences de chaque mot dans un paragraphe :
texte = """
Python est un langage formidable pour la data.
La data science utilise intensivement Python et ses bibliotheques.
Apprenez Python avec rigueur.
"""
# Nettoyage et découpage en mots minuscules
mots = texte.lower().replace(".", "").replace("\n", " ").split()
# Calcul des fréquences d'apparition
frequences = {}
for mot in mots:
# get(mot, 0) renvoie 0 si le mot est vu pour la première fois
frequences[mot] = frequences.get(mot, 0) + 1
# Affichage des 3 mots les plus fréquents
classement = sorted(frequences.items(), key=lambda item: item[1], reverse=True)
print("=== OCCURRENCES DES MOTS DU TEXTE ===")
for mot, compte in classement[:5]:
print(f"Mot : '{mot:<15}' -> {compte} apparition(s)")
7. Défi d'application#
Écrivez une fonction fusionner_inventaires(inv1: dict, inv2: dict) -> dict qui prend deux dictionnaires de stocks (ex: {"stylos": 10, "cahiers": 5} et {"stylos": 4, "gommes": 8}) et retourne un dictionnaire consolidé où les quantités des articles communs sont additionnées ({"stylos": 14, "cahiers": 5, "gommes": 8}).
Commentaires