edubun
Français

Les dictionnaires

Chercher une clé absente d'un dictionnaire arrête le programme avec KeyError, mais d.get(key, 0) renvoie 0 à la place.

Seoyeon a 12 bulletins et trois candidats

ContexteSeoyeon (une élève inventée) compte les voix pour le délégué de classe. Trois camarades se présentent : Ari, Bo et Cy. Douze bulletins pliés sont dans une boîte. Sur papier, elle écrirait les trois noms sur le côté d'une page et ajouterait un trait à côté d'un nom chaque fois qu'elle ouvre un bulletin. Elle veut faire de même en Python, et découvre vite qu'une liste n'est pas pratique pour cela. Avec une liste, elle devrait se rappeler que la position 0 est Ari et la position 1 Bo. Ce qu'elle veut, c'est une table qui va directement d'un nom à un nombre.

Cette table est un dictionnaire. Un dictionnaire stocke des paires : une clé et la valeur qui l'accompagne. On l'écrit entre accolades, avec deux-points entre chaque clé et sa valeur. Pour lire une valeur, mets la clé entre crochets, comme tu mettrais un indice après une liste. Pour ajouter une paire ou en changer une, affecte à cette clé.

votes = {"Ari": 0, "Bo": 0, "Cy": 0}
votes["Bo"] = votes["Bo"] + 1
votes["Ari"] += 1
votes["Bo"] += 1
print(votes)
print(votes["Bo"])
Sortie
{'Ari': 1, 'Bo': 2, 'Cy': 0}
2
Un dictionnaire associe chaque clé à une valeur. votes["Bo"] va directement à 5 sans compter les positions.

Compter toute la boîte en une boucle

Taper une ligne par bulletin ne vaut pas mieux que des traits sur papier. Seoyeon met les bulletins dans une liste et la parcourt en boucle. Il y a un accroc : et si un bulletin désigne quelqu'un qu'elle n'a pas prévu, ou si elle préfère ne pas lister les candidats d'abord ? Lire une clé absente avec des crochets arrête le programme. La méthode get(key, default) règle cela. Elle renvoie la valeur si la clé est là et la valeur par défaut sinon, donc votes.get(name, 0) + 1 marche pour la première voix et toutes les suivantes.

ballots = ["Bo", "Ari", "Bo", "Cy", "Bo", "Ari",
           "Cy", "Bo", "Ari", "Bo", "Cy", "Bo"]
votes = {}
for name in ballots:
    votes[name] = votes.get(name, 0) + 1
print(votes)
print(len(ballots), sum(votes.values()))
Sortie
{'Bo': 6, 'Ari': 3, 'Cy': 3}
12 12

La dernière ligne est la vérification de Seoyeon. Douze bulletins sont entrés, et les comptes font douze au total : aucun n'a donc été perdu. Remarque l'ordre des noms dans la sortie : Bo en premier, parce que Bo est le premier nom que la boucle a rencontré. Depuis Python 3.7, un dictionnaire garde ses clés dans l'ordre où elles ont été ajoutées pour la première fois, et la section du tutoriel sur les dictionnaires le dit aussi.

Parcourir clés et valeurs ensemble

Une boucle for sur un dictionnaire donne les clés. items() donne clé et valeur ensemble, ce qu'il te faut pour un tableau de résultats. in vérifie si une clé existe, et max() avec key=votes.get trouve la clé de plus grande valeur. Ce dernier schéma est à copier tel quel, même avant que chaque partie ait du sens.

votes = {"Bo": 6, "Ari": 3, "Cy": 3}
for name, n in votes.items():
    print(name, "#" * n, n)
print("Dan" in votes)
print(max(votes, key=votes.get))
Sortie
Bo ###### 6
Ari ### 3
Cy ### 3
False
Bo

Les dictionnaires apparaissent partout où les données viennent en paires nom et valeur : un mot et son sens, une station de métro et son numéro de ligne, un numéro d'élève et un nom. Les clés doivent être uniques, et affecter à une clé existante remplace son ancienne valeur au lieu d'ajouter un second exemplaire.

dictionnaireDes paires clé : valeur entre { }
cléLe nom par lequel on cherche une valeur ; les clés sont uniques
d[key]Lit la valeur ; KeyError si la clé manque
d.get(key, default)Lit la valeur, ou donne la valeur par défaut si la clé manque
d.items()Les paires clé et valeur pour une boucle for
key in dTrue si le dictionnaire a cette clé
  1. Qu'affiche ce code ?
    price = {"gimbap": 3500, "ramen": 4500}
    print(price["ramen"])
  2. Qu'affiche ce code ?
    price = {"gimbap": 3500}
    price["tteokbokki"] = 5000
    print(len(price))
  3. Qu'affiche ce code ?
    price = {"gimbap": 3500}
    price["gimbap"] = 4000
    print(price)
  4. Qu'affiche ce code ?
    stock = {"pens": 4}
    print(stock.get("pens", 0), stock.get("tape", 0))
  5. Que se passe-t-il quand ce code s'exécute ?
    stock = {"pens": 4}
    print(stock["tape"])
    • Il affiche 0
    • Il affiche None
    • Il affiche tape
    • Il s’arrête avec KeyError: 'tape'
  6. Qu'affiche ce code ?
    counts = {}
    for ch in "hello":
        counts[ch] = counts.get(ch, 0) + 1
    print(counts["l"])
  7. Qu'affiche ce code ?
    ages = {"Mina": 14, "Jun": 13}
    print("Jun" in ages, 14 in ages)
  8. Qu'affiche ce code ?
    d = {"b": 2, "a": 1}
    for k in d:
        print(k)
    • a
      b
    • b
      a
    • 2
      1
    • b 2
      a 1
  9. Qu'affiche ce code ?
    scores = {"Ari": 3, "Bo": 6, "Cy": 3}
    print(max(scores, key=scores.get))
  10. Qu'affiche ce code ?
    d = {"x": 1, "y": 2}
    total = 0
    for k, v in d.items():
        total += v
    print(total)
Erreurs fréquentes
  • « votes["Dan"] donne 0 si Dan n'a reçu aucune voix. » Si "Dan" n'a jamais été ajouté comme clé, la recherche s'arrête avec KeyError: 'Dan'. Utilise votes.get("Dan", 0) quand une clé peut manquer.
  • « 14 in ages vérifie si quelqu'un a 14 ans. » in regarde les clés, pas les valeurs. Pour chercher dans les valeurs, écris 14 in ages.values().
  • « Les dictionnaires ont des positions comme les listes, donc votes[0] est le premier candidat. » Un dictionnaire se consulte par clé, pas par position. votes[0] cherche une clé égale à 0 et donne KeyError: 0.
Note du professeurLes traits sur papier sont le pont. Compte d'abord à la main un petit ensemble de voix réelles ou inventées, puis montre que le dictionnaire est la même table, le nom à gauche et le compte à droite. La ligne get(key, 0) + 1 mérite d'être mémorisée comme un tout, car compter des choses est le travail le plus courant des dictionnaires dans les projets de débutants. Vérifier que les comptes redonnent le nombre de bulletins est une habitude à prendre tôt. Dans le cours coréen d'informatique du lycée, choisir le bon type de données est un standard à part entière, et une comparaison dictionnaire contre liste y trouve sa place.
L'essentiel
  • Un dictionnaire stocke des paires clé : valeur dans { }.
  • d[key] lit une valeur ; une clé absente donne KeyError.
  • d.get(key, default) évite le KeyError.
  • counts[x] = counts.get(x, 0) + 1 est le schéma de comptage.
  • for k, v in d.items() : parcourt les paires dans l'ordre où elles ont été ajoutées.
Sources de ce cours (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

Consulté le: 2026-10-19