Les dictionnaires en Python

01 Sep 2019 01 Sep 2019 11782 vues ESSADDOUKI Mostafa 9 min de lecture

Les Dictionnaires

Dans de nombreux problèmes algorithmiques, il est indispensable de pouvoir associer une information à une autre. Les listes offrent un accès rapide par indice, mais ne permettent pas d'associer directement une valeur à une clé choisie librement.

Problème algorithmiqueSolution avec un dictionnaire
Associer un étudiant à sa note{"Ahmed": 16.5, "Sara": 18}
Compter les occurrences d'éléments{"a": 3, "b": 1, "c": 2}
Mémoïsation (cacher des résultats){n: fib(n) for n in range(10)}
Table de symboles, configuration{"host": "localhost", "port": 8080}
Définition — Dictionnaire Un dictionnaire est une structure de données composée de paires (clé : valeur). C'est exactement comme un vrai dictionnaire : on cherche un mot (clé) → on trouve immédiatement sa définition(valeur).
  • Les clés doivent être uniques et immuables (entiers, chaînes, tuples…)
  • Les valeurs peuvent être de n'importe quel type
  • Réutiliser une clé écrase la valeur précédente
Dictionnaire vu comme une fonction mathématique Un dictionnaire peut être vu comme une fonction : domaine = clés, codomaine = valeurs, f(clé) = valeur. L'accès d[clé] est analogue à l'évaluation f(clé), et s'effectue en temps O(1) grâce au hachage.

Création d'un dictionnaire


Syntaxe Python
d1 = {}                              # dictionnaire vide
d2 = dict()                          # dictionnaire vide (constructeur)
d3 = {"clé1": val1, "clé2": val2}   # création avec initialisation
d4 = dict([("clé1", val1), ...])    # depuis une liste de tuples
d5 = {k: expr for k in iterable}    # compréhension de dictionnaire

Exemple n°1 — Différentes créations

# Création directe
etudiant = {"nom": "Ahmed", "age": 19, "note": 16.25}
print(etudiant)

# Depuis une liste de tuples
personnes = dict([("ahmed", 18), ("sara", 17), ("ismail", 20)])
print(personnes)

# Par compréhension — table des carrés
carres = {i: i**2 for i in range(1, 6)}
print(carres)

# Fonction mathématique représentée comme dictionnaire
f_carree = {x: x**2 for x in range(1, 5)}
print(f"f(2) = {f_carree[2]}")   # f(2) = 4
Sortie
{'nom': 'Ahmed', 'age': 19, 'note': 16.25}
{'ahmed': 18, 'sara': 17, 'ismail': 20}
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
f(2) = 4

Accès, Ajout et Modification

Accès à une valeur

On accède à une valeur en utilisant la clé entre crochets d[clé], comme l'indexation dans une liste — mais avec une clé quelconque au lieu d'un entier.

Exemple n°2 — Accès par clé

personnes = {"ahmed": 18, "sara": 17, "ismail": 20}

print(personnes["ahmed"])    # 18
print(personnes["ismail"])   # 20
Sortie
18
20
Erreur — Clé inexistante → KeyError Accéder à une clé absente lève immédiatement une KeyError:
print(personnes["ikram"])   # ❌ KeyError: 'ikram'
Pour éviter cela, utiliser get() (voir ci-dessous).

Accès sécurisé — méthode get()


Syntaxe Python
d.get(clé)                  # retourne None si clé absente
d.get(clé, valeur_défaut)   # retourne valeur_défaut si clé absente

Exemple n°3 — get() vs accès direct

personnes = {"ahmed": 18, "sara": 17, "ismail": 20}

# Clé présente
print(personnes.get("sara"))               # 17

# Clé absente — retourne None
print(personnes.get("ikram"))              # None

# Clé absente — retourne la valeur par défaut
print(personnes.get("ikram", "inconnu"))   # inconnu

# Usage typique : compter les occurrences
texte = "algorithme"
compteur = {}
for c in texte:
    compteur[c] = compteur.get(c, 0) + 1
print(compteur)
Sortie
17
None
inconnu
{'a': 1, 'l': 1, 'g': 1, 'o': 1, 'r': 1, 'i': 1, 't': 1, 'h': 1, 'm': 1, 'e': 1}

Ajout et modification

La même syntaxe d[clé] = valeur sert à la fois pour ajouter une nouvelle paire et modifier une valeur existante.

Exemple n°4 — Ajout et modification

personnes = {"ahmed": 18, "sara": 17, "ismail": 20}
print(f"Initial  : {personnes}")

# Modification d'une clé existante
personnes["sara"] = 19
print(f"Modifié  : {personnes}")

# Ajout d'une nouvelle clé
personnes["ikram"] = 18
print(f"Ajouté   : {personnes}")

# setdefault() — ajoute seulement si la clé est absente
personnes.setdefault("karim", 21)    # ajouté
personnes.setdefault("ahmed", 99)    # ignoré (ahmed existe déjà)
print(f"Après setdefault : {personnes}")
Sortie
Initial  : {'ahmed': 18, 'sara': 17, 'ismail': 20}
Modifié  : {'ahmed': 18, 'sara': 19, 'ismail': 20}
Ajouté   : {'ahmed': 18, 'sara': 19, 'ismail': 20, 'ikram': 18}
Après setdefault : {'ahmed': 18, 'sara': 19, 'ismail': 20, 'ikram': 18, 'karim': 21}
Astuce — setdefault() vs get()
  • get(clé, défaut) : retourne la valeur sans modifier le dict
  • setdefault(clé, défaut) : retourne la valeur et insère la paire si la clé est absente — très utile pour initialiser des compteurs ou des listes

Parcours des dictionnaires

Python fournit trois méthodes de vue pour parcourir un dictionnaire. Ces vues sont dynamiques : elles reflètent les modifications du dictionnaire en temps réel.

MéthodeRetourneUtilisation typique
for k in dClés (implicite)Parcours simple par clé
d.keys()dict_keys — vue sur les clésTester, convertir en liste
d.values()dict_values — vue sur les valeursSommer, filtrer les valeurs
d.items()dict_items — tuples (clé, valeur)✅ Parcours le plus complet et recommandé

Exemple n°5 — Les quatre formes de parcours

personnes = {"ahmed": 18, "sara": 17, "ismail": 20}

# 1. Parcours implicite des clés
print("── Clés (implicite) ──")
for nom in personnes:
    print(nom, end="  ")

# 2. keys()
print("\n── keys() ──")
for nom in personnes.keys():
    print(f"{nom:10} → {personnes[nom]}")

# 3. values()
print("── values() ──")
for age in personnes.values():
    print(age, end="  ")

# 4. items() — le plus élégant
print("\n── items() ──")
for nom, age in personnes.items():
    print(f"l'âge de {nom:8} est {age}")
Sortie
── Clés (implicite) ──
ahmed  sara  ismail
── keys() ──
ahmed      → 18
sara       → 17
ismail     → 20
── values() ──
18  17  20
── items() ──
l'âge de ahmed    est 18
l'âge de sara     est 17
l'âge de ismail   est 20

Opérations et méthodes utiles

OpérationSyntaxeDescription
Taillelen(d)Nombre de paires clé-valeur
Appartenanceclé in dTeste si la clé existe (O(1))
Suppressiondel d[clé]Supprime la paire, KeyError si absente
Suppression + retourd.pop(clé, défaut)Supprime et retourne la valeur
Viderd.clear()Supprime toutes les paires
Fusion (Python 3.9+)d1 | d2Nouveau dict fusionné
Fusion en placed1 |= d2Met à jour d1 avec d2
Copied.copy()Copie superficielle

Exemple n°6 — Opérations courantes

personnes = {"ahmed": 18, "sara": 17, "ismail": 20}

# Taille
print(f"Taille       : {len(personnes)}")

# Test d'appartenance
print(f"ahmed in d   : {'ahmed' in personnes}")
print(f"ikram in d   : {'ikram' in personnes}")

# Suppression avec del
del personnes["ahmed"]
print(f"Après del    : {personnes}")

# Suppression avec pop
age = personnes.pop("sara")
print(f"pop('sara')  : {age}  →  {personnes}")

# Suppression sécurisée avec pop + valeur par défaut
val = personnes.pop("inconnu", "absent")
print(f"pop sécurisé : {val}")

# Vider le dictionnaire
personnes.clear()
print(f"Après clear  : {personnes}")
Sortie
Taille       : 3
ahmed in d   : True
ikram in d   : False
Après del    : {'sara': 17, 'ismail': 20}
pop('sara')  : 17  →  {'ismail': 20}
pop sécurisé : absent
Après clear  : {}

Exemple n°7 — Fusion de dictionnaires

d1 = {"a": 1, "b": 2}
d2 = {"b": 9, "c": 3}   # clé "b" en conflit

# Fusion → nouveau dictionnaire (d2 écrase d1 sur les conflits)
d_fusion = d1 | d2
print(f"d1 | d2  = {d_fusion}")

# Fusion en place
d1 |= d2
print(f"d1 |= d2 = {d1}")

# Méthode update() (compatible Python < 3.9)
d3 = {"x": 10, "y": 20}
d3.update({"y": 99, "z": 30})
print(f"update() = {d3}")
Sortie
d1 | d2  = {'a': 1, 'b': 9, 'c': 3}
d1 |= d2 = {'a': 1, 'b': 9, 'c': 3}
update() = {'x': 10, 'y': 99, 'z': 30}
Attention — Clés en conflit lors d'une fusion En cas de clé commune, la valeur du dictionnaire de droite (d2) écrase celle de gauche (d1) : d1 | d2 → les valeurs de d2 ont la priorité.

Compréhension de dictionnaires


Syntaxe Python
{clé: valeur for variable in iterable}
{clé: valeur for variable in iterable if condition}

Exemple n°8 — Compréhensions de dictionnaires

# Table des carrés
carres = {x: x**2 for x in range(1, 6)}
print(f"Carrés    : {carres}")

# Inverser un dictionnaire (clé ↔ valeur)
original = {"a": 1, "b": 2, "c": 3}
inverse  = {v: k for k, v in original.items()}
print(f"Inversé   : {inverse}")

# Filtrer les étudiants admis (note >= 10)
notes = {"Ahmed": 16, "Sara": 8, "Ismail": 12, "Ikram": 9}
admis = {nom: n for nom, n in notes.items() if n >= 10}
print(f"Admis     : {admis}")

# Normaliser des notes sur 20
normalises = {nom: round(n * 20 / max(notes.values()), 2)
              for nom, n in notes.items()}
print(f"Normalisé : {normalises}")
Sortie
Carrés    : {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Inversé   : {1: 'a', 2: 'b', 3: 'c'}
Admis     : {'Ahmed': 16, 'Ismail': 12}
Normalisé : {'Ahmed': 20.0, 'Sara': 10.0, 'Ismail': 15.0, 'Ikram': 11.25}

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.