Retour au cours

Des casiers avec des noms

Les tableaux associatifs

Supplément du cours 7 - version sans indications de type

Le pilulier

Pilulier de sept casiers colorés, un par jour de la semaine, de dimanche à samedi

Photo : pilulier de la semaine, tirée d'une recherche d'images (« pill box monday tuesday »)

Mercredi matin, combien de comprimés faut-il prendre ?

Personne ne compte « dimanche 0, lundi 1, mardi 2, mercredi 3 » pour trouver le casier numéro 3.

On lit l'étiquette, et on ouvre le casier mercredi.

De la boîte numérotée au pilulier

La semaine dans une liste : il faut se souvenir que mercredi, c'est le casier 3

20111233142506
pilules[3] # mercredi ? il faut compter...

La même semaine dans un pilulier : le casier porte son nom

2"dimanche"1"lundi"1"mardi"3"mercredi"1"jeudi"2"vendredi"0"samedi"
pilulier["mercredi"] # on lit l'étiquette

L'étiquette et le contenu

pilulier = { "dimanche": 2, "lundi": 1, "mardi": 1, "mercredi": 3, "jeudi": 1, "vendredi": 2, "samedi": 0 }
2"dimanche"1"lundi"1"mardi"3"mercredi"1"jeudi"2"vendredi"0"samedi"

L'étiquette sur la face, le contenu dans le casier.

⚖️ La structure que vous venez de remplir : le dictionnaire (un tableau associatif, qu'on appelle aussi table de hachage ou hashmap dans d'autres langages). L'étiquette s'appelle la clé, le contenu s'appelle la valeur. Les accolades { } et le deux-points clé: valeur les associent.

Ouvrir un casier par son nom

2"dimanche"1"lundi"1"mardi"3"mercredi"1"jeudi"2"vendredi"0"samedi"3

Code

dose = pilulier["mercredi"] print(dose)

Résultat

3

Entre les crochets : l'étiquette (une chaîne), jamais un numéro.

Remplacer le contenu d'un casier

pilulier["samedi"] = 2 # le médecin a changé la dose du samedi

Avant

2"dimanche"1"lundi"1"mardi"3"mercredi"1"jeudi"2"vendredi"0"samedi"

Après : même étiquette, nouveau contenu

2"dimanche"1"lundi"1"mardi"3"mercredi"1"jeudi"2"vendredi"2"samedi"

L'étiquette qui n'existe pas

2"dimanche"1"lundi"1"mardi"3"mercredi"1"jeudi"2"vendredi"0"samedi"?"Lundi"
print(pilulier["Lundi"])
KeyError: 'Lundi'

Avant d'ouvrir, on vérifie que l'étiquette existe avec in :

print("lundi" in pilulier) print("Lundi" in pilulier)
True False

« Lundi » et « lundi » sont deux étiquettes différentes : une majuscule suffit pour manquer le casier.

Le plateau repas

Entrée, plat, breuvage, dessert

Un casier par service

repas = { "entrée": "soupe", "plat": "pâté chinois", "breuvage": "lait", "dessert": "pouding chômeur" }
print(repas["plat"])
pâté chinois
"soupe""entrée""pâté chinois""plat""lait""breuvage""pouding chômeur""dessert""pâté chinois"

Les valeurs ne sont pas obligatoirement des nombres : ici, ce sont des chaînes.

Ajouter et retirer un casier

repas["collation"] = "pomme"

Une nouvelle étiquette : Python colle un nouveau casier au plateau. Pas besoin d'append.

"soupe""entrée""pâté chinois""plat""lait""breuvage""pouding chômeur""dessert""pomme""collation"
repas.pop("breuvage")

pop(clé) retire le casier qui porte cette étiquette (il contenait "lait"). del repas["breuvage"] fait la même chose.

"soupe""entrée""pâté chinois""plat""pouding chômeur""dessert"

Chaque exemple part du plateau d'origine. Personne ne « recule d'un cran » : il n'y a pas de numéros à décaler.

Parcourir le pilulier, étiquette par étiquette

2"dimanche"1"lundi"1"mardi"3"mercredi"1"jeudi"2"vendredi"0"samedi"
for jour in pilulier: print(f"{jour} : {pilulier[jour]} comprimé(s)")

Le for donne les étiquettes ; pilulier[jour] ouvre le casier.

dimanche : 2 comprimé(s) lundi : 1 comprimé(s) mardi : 1 comprimé(s) mercredi : 3 comprimé(s) jeudi : 1 comprimé(s) vendredi : 2 comprimé(s) samedi : 0 comprimé(s)

L'étiquette et le contenu, ensemble

for service, mets in repas.items(): print(f"{service} → {mets}")

items() donne les deux à chaque tour : la clé dans service, la valeur dans mets.

Résultat

entrée → soupe plat → pâté chinois breuvage → lait dessert → pouding chômeur

Des piluliers partout en sciences

Masses atomiques

1.008"H"12.011"C"15.999"O"
massesAtomiques = { "H": 1.008, "C": 12.011, "O": 15.999 }

Lunes des planètes

0"Mercure"1"Terre"2"Mars"
lunes = { "Mercure": 0, "Terre": 1, "Mars": 2 }

Unités du SI

"m/s""vitesse""N""force""J""énergie"
unites = { "vitesse": "m/s", "force": "N", "énergie": "J" }
masseEau = 2 * massesAtomiques["H"] + massesAtomiques["O"]
18.015

Le pilulier en grille

Pilulier en grille : une rangée colorée par jour, quatre casiers par rangée pour les moments de la journée

Photo : pilulier jour par moment, tirée d'une recherche d'images (« pill box monday tuesday »)

"dimanche""lundi""mardi""mercredi""jeudi""vendredi""samedi"
"matin"1112110
"midi"0100100
"soir"1111121
semaine = { "dimanche": {"matin": 1, "midi": 0, "soir": 1}, # ... un petit pilulier par jour ... } print(semaine["mercredi"]["soir"])

semaine["mercredi"] ouvre la rangée du mercredi : c'est elle-même un pilulier, {"matin": 2, "midi": 0, "soir": 1}.

Puis ["soir"] ouvre le casier du soir : 1. Le jour, puis le moment : comme la tablette, puis la porte du meuble.

À vous : quel casier ?

Avant de cliquer, prédisez ce que donne chaque expression, puis cliquez sur un casier pour l'ouvrir :

  • repas["dessert"]
  • repas["entrée"]
  • "breuvage" in repas et "soupe" in repas (le piège : in lit les étiquettes)
"soupe""entrée""pâté chinois""plat""lait""breuvage""pouding chômeur""dessert"
Cliquez sur un casier

Boîte numérotée ou pilulier ?

Pour chaque situation, quelle structure choisir : une liste ou un dictionnaire ?

Les températures mesurées chaque heure, dans l'ordre Liste : l'ordre compte, le numéro suffit
La capitale de chaque pays Dictionnaire : on cherche par le nom du pays
Le nombre d'électrons de chaque élément chimique Dictionnaire : l'étiquette est le symbole (« Na »)
Les 30 lancers d'un dé pour une expérience Liste : des mesures à la suite, sans nom

À retenir

Le dictionnaire = un pilulier

Chaque casier porte une clé (son étiquette) et contient une valeur.

Lire et remplacer

pilulier["mercredi"] lit, pilulier["samedi"] = 2 remplace.

Ajouter et retirer

Une nouvelle clé ajoute un casier ; pop(clé) ou del le retire.

L'étiquette absente

KeyError : vérifier avec clé in dictionnaire (majuscules comprises).

Parcourir

for clé in d donne les étiquettes, d.items() les paires.

Le pilulier en grille

semaine["mercredi"]["soir"] : un dictionnaire de dictionnaires.