Introduction : Au-delà des bases du dictionnaire
Tu sais déjà créer un dictionnaire, ajouter ou modifier une paire clé-valeur avec mon_dict['clé'] = valeur, et parcourir ses éléments avec une boucle for. C'est un excellent début ! Mais en NSI, pour tes projets et pour écrire un code plus efficace et élégant, tu dois aller plus loin. Les dictionnaires sont des structures de données incroyablement puissantes en Python. Dans cet article, on va explorer ensemble des techniques avancées qui vont te permettre de les manipuler comme un pro.
Les compréhensions de dictionnaires (Dict Comprehensions)
Tu connais sûrement les compréhensions de listes. Et bien figure-toi que ça existe aussi pour les dictionnaires ! C'est une façon concise et rapide de créer un dictionnaire à partir d'un itérable.
Imaginons que tu veuilles créer un dictionnaire qui associe les nombres de 1 à 5 à leur carré. Au lieu d'écrire une boucle classique, tu peux faire :
carres = {n: n**2 for n in range(1, 6)}
print(carres) # Affiche {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}La syntaxe est {clé: valeur for élément in itérable}. Tu peux même ajouter une condition :
carres_pairs = {n: n**2 for n in range(1, 11) if n % 2 == 0}
print(carres_pairs) # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}Cette méthode est non seulement plus lisible, mais elle est aussi souvent plus performante qu'une boucle classique. Utilise-la pour transformer ou filtrer des données rapidement.
Fusionner des dictionnaires avec élégance
Tu as deux dictionnaires et tu veux les combiner en un seul. Plusieurs méthodes s'offrent à toi, selon ta version de Python.
L'opérateur de déballage (Python 3.5+)
C'est la méthode la plus « pythonique » et la plus lisible :
d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'd': 4}
d_fusionne = {**d1, **d2}
print(d_fusionne) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}Attention aux conflits : si une clé est présente dans les deux dictionnaires, la valeur du dernier dictionnaire déballé (**d2 ici) écrase la première.
La méthode update() et l'opérateur | (Python 3.9+)
La méthode update() modifie le dictionnaire original. Depuis Python 3.9, tu as aussi l'opérateur | (union) qui crée un nouveau dictionnaire :
nouveau = d1 | d2 # Crée un nouveau dictionnaire fusionné
d1 |= d2 # Modifie d1 en y ajoutant les éléments de d2 (comme update())Trier un dictionnaire par clé ou par valeur
Les dictionnaires « natifs » (avant Python 3.7) ne gardaient pas l'ordre d'insertion. Maintenant, si. Mais tu veux parfois les trier selon un critère précis.
Pour obtenir une liste des clés triées, c'est simple : sorted(mon_dict). Mais pour trier le dictionnaire lui-même selon ses valeurs, c'est plus intéressant. Utilisons la fonction sorted() avec son paramètre key :
notes = {'Alice': 15, 'Bob': 8, 'Clara': 17, 'David': 12}
# Trier par valeur (note) décroissante et créer un nouveau dict ordonné
notes_triees = dict(sorted(notes.items(), key=lambda item: item[1], reverse=True))
print(notes_triees) # {'Clara': 17, 'Alice': 15, 'David': 12, 'Bob': 8}Décortiquons :
notes.items()donne une vue des paires (clé, valeur).key=lambda item: item[1]dit àsortedde se baser sur le second élément de chaque paire (la valeur).reverse=Truetrie en ordre décroissant.dict(...)reconstruit un dictionnaire à partir de la liste triée.
Les méthodes get(), setdefault() et defaultdict
Ces méthodes sont essentielles pour éviter les erreurs et écrire un code robuste.
get() : la sécurité avant tout
Au lieu de faire mon_dict['clé'] et risquer une KeyError si la clé n'existe pas, utilise get() :
valeur = mon_dict.get('clé', 'valeur_par_defaut')
# Si 'clé' existe, valeur = sa valeur. Sinon, valeur = 'valeur_par_defaut'.setdefault() : « get » et « set » en un
Cette méthode est un peu magique. Elle renvoie la valeur d'une clé si elle existe. Si elle n'existe pas, elle insère la clé avec la valeur par défaut fournie, puis renvoie cette valeur. Parfait pour initialiser des structures complexes :
d = {}
# Sans setdefault :
if 'liste' not in d:
d['liste'] = []
d['liste'].append(1)
# Avec setdefault, en une ligne :
d.setdefault('liste', []).append(1)defaultdict du module collections
Pour aller encore plus loin, defaultdict est un dictionnaire qui appelle automatiquement une fonction (comme list, int, dict) pour fournir une valeur par défaut à une clé manquante.
from collections import defaultdict
d = defaultdict(list) # Une liste vide par défaut
d['eleves'].append('Alice') # Pas besoin de vérifier si 'eleves' existe !
print(d) # defaultdict(<class 'list'>, {'eleves': ['Alice']})Parcourir efficacement avec items(), keys() et values()
Pour itérer sur un dictionnaire, utilise toujours .items() pour avoir directement la clé et la valeur :
for cle, valeur in mon_dict.items():
print(f"{cle} -> {valeur}")Les vues .keys() et .values() sont aussi très utiles, notamment pour tester l'appartenance de manière optimale : if 'ma_cle' in mon_dict.keys(): (même si in mon_dict suffit).
Conclusion : Des dictionnaires au cœur de tes projets NSI
Maîtriser ces techniques avancées sur les dictionnaires n'est pas un exercice de style. C'est ce qui fera la différence dans tes projets NSI. Que ce soit pour analyser des données, représenter un graphe (où un dictionnaire de listes d'adjacence est très efficace), gérer un inventaire dans un jeu ou configurer une application, les dictionnaires sont partout. Alors, entraîne-toi avec ces astuces, et tu verras que ton code deviendra plus clair, plus concis et plus puissant. N'hésite pas à les combiner entre elles pour résoudre des problèmes complexes de manière élégante !
