Aller au contenu

8. Dictionnaires⚓︎

8.1 Position du problème⚓︎

Un tableau Python possède une seule caractéristique : la valeur portée dans le tableau.

On peut dire que cette valeur est en quelque sorte reliée à une position.

Exemple

Dans le tableau ["0626130029", "0616248329", "0601118218"] :

  • "0616248329" est à la position 1 ;
  • "0601118218" à la position 2.

Toutefois, si maintenant je souhaite accéder au nom des personnes associées à ces numéros de téléphone, c'est compliqué. Il faudrait un deuxième tableau contenant des noms de personnes à la même position : ["Maman", "Papa", "Médor"].

Dans un tableau, la position sert donc de clé primaire (pour dans l'exemple, fusionner deux tableaux).

8.2 Premier contact⚓︎

Il y a beaucoup plus pratique : le dictionnaire.

Comme dans un dictionnaire réel, un dictionnaire Python est composé de deux champs :

  • une clé ;
  • une valeur.

Exemple

Tout de suite, un exemple :

un_dico = {"nom": "LaTaupe", "prenom": "René", "naissance": 2009}

à comparer avec :

un_tableau = ["LaTaupe", "René", 2009].

Cours

Quelques généralités sur les dictionnaires :

  • un dictionnaire se caractérise par des accolades {} ;
  • les clés sont définies avant les deux points. Les clés peuvent être de n'importe quel type non mutable.
  • la valeur associée à la clé est indiquée après les deux points. Les valeurs peuvent être de n'importe quel type.

Exemple

Dans l'exemple précédent :

  • quelles sont les clés de un_dico?
  • quelles sont les valeurs associées ?
Solution

La clé nom est associée à la valeur LaTaupe, à la clé prenom est René et à la clé naissance, 2009.

Cours

Il est possible d'initialiser un dictionnaire vide puis de le remplir avec les 4 lignes suivantes :

un_dico = {}     # monDico = dict() est une autre syntaxe possible.
un_dico["nom"] = "LaTaupe"
un_dico["prenom"] = "René"
un_dico["naissance"] = 2009

Essayez de créer vous-même ce dictionnaire en recopiant ces instructions.

Créer des dictionnaires

Dans les exercices ci-dessous, créer les dictionnaires demandés.

Dictionnaire nommé genre qui indique le genre des mots suivants : table, chemin, rail. Le féminin se notera par la lettre 'f' et le masculin par la lettre 'm'.

Solution
genre = {}
genre['table'] = 'f'
genre['chemin'] = 'm'
genre['rail'] = 'm'

ou, en une ligne :

genre = {'table' : 'f', 'chemin' : 'm', 'rail' : 'm'}

Dictionnaire nommé film qui indique les caractéristiques de film :

  • Pulp Fiction est associé à ['Tarantino', 1994]
  • Kill Bill est associé à ['Tarantino', 2003]
  • Holy Grail est associé à ['Monty Python', 1975]

Solution

Remarquez qu'on associe à un clé, un tableau de valeurs.

genre = {}
genre['Pulp Fiction'] = ['Tarantino', 1994]
genre['Kill Bill'] = ['Tarantino', 2003]
genre['Holy Grail'] = ['Monty Python', 1975]

Je déconseille ici la solution sur une ligne, difficile à lire.

8.3 Manipuler des dictionnaires⚓︎

Cours

Pour accéder à la valeur associée à une clé, on utilise la syntaxe : un_dico[clé]

Pour ajouter ou modifier la valeur associée à une clé, on fait simplement : un_dico[clé] = nouvelle_valeur

Exemple

Dans le programme ci-dessous, un dictionnaire a été défini. Sans modifier la ligne de définition,

  • afficher la valeur associée à la clé gamma ;
  • corriger les valeurs associées aux clés alpha et beta (respectivement, a et b).
  • ajouter la clé delta associée à d.

unpy-unddico = {'alpha' : 'k', 'beta' : 'p', 'gamma' : 'c'}bksl-nl

Exercice 3

On modélise un panier de fruits de la manière suivante :

  • les clés sont les noms des fruits ;
  • les valeurs sont la quantité de fruit.

Créer une fonction liste_de_course qui prend en paramètres un dictionnaire panier et un fruit fruit et qui écrit un fruit à acheter dans un dictionnaire. La quantité par défaut est 0.

panierpy-unddepy-undfruits = {}bksl-nlassert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, 'mandarine')['mandarine'] == 0bksl-nlassert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, 'pomme')['pomme'] == 0bksl-nlfor fruit in ['prune', 'abricot', 'coing']:bksl-nl assert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, fruit)[fruit] == 0bksl-nl 5/5
panierpy-unddepy-undfruits = {}bksl-nlbksl-nldef listepy-unddepy-undcourse(panier, fruit):bksl-nl passbksl-nlbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, 'mandarine')['mandarine'] == 0bksl-nlassert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, 'pomme')['pomme'] == 0bksl-nlfor fruit in ['prune', 'abricot', 'coing']:bksl-nl assert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, fruit)[fruit] == 0 bksl-nlpanierpy-unddepy-undfruits = {}bksl-nlbksl-nldef listepy-unddepy-undcourse(panier, fruit):bksl-nl panier[fruit] = 0bksl-nl return panierbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, 'mandarine')['mandarine'] == 0bksl-nlassert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, 'pomme')['pomme'] == 0bksl-nlfor fruit in ['prune', 'abricot', 'coing']:bksl-nl assert listepy-unddepy-undcourse(panierpy-unddepy-undfruits, fruit)[fruit] == 0 bksl-nl

Cours

On peut boucler sur les clés d'un dictionnaire à l'aide de cette syntaxe.

for clé in un_dictionnaire:
    print(clé)

Exemple

  • Reprendre votre liste de course obtenue à l'exercice précédent et, à l'aide d'une boucle sur les clé, afficher tous les fruits que vous devez acheter.
  • En ajoutant une instruction, afficher quelles sont les quantités actuellement présentes dans votre panier (cela devrait être 0).

Solution
for fruit in panier_de_fruits:
    quantité = panier_de_fruits[fruit]
    print(fruit, quantité)

Exercice 4

Continuons sur ce panier de fruits.

On peut tester si une clé est présent dans un dictionnaire simplement en le demandant gentiment : clé in un_dictionnaire.

Créer une fonction ajouter_fruit qui prend en paramètres un dictionnaire panier et un fruit fruit et qui ajoute un fruit dans un dictionnaire. Si un fruit est déjà présent dans le panier, la quantité est augmentée de 1. Sinon, on affiche un message d'erreur : Ce fruit n'est pas sur la liste de courses.

panierpy-unddepy-undfruits = {}bksl-nlassert ajouterpy-undfruit(panierpy-unddepy-undfruits, 'mandarine')['mandarine'] == 0bksl-nlassert ajouterpy-undfruit(panierpy-unddepy-undfruits, 'pomme')['pomme'] == 0bksl-nlfor fruit in ['prune', 'abricot', 'coing']:bksl-nl assert ajouterpy-undfruit(panierpy-unddepy-undfruits, fruit)[fruit] == 0bksl-nl 5/5
panierpy-unddepy-undfruits = {'pomme' : 0, 'poire' : 0, 'abricot' : 0}bksl-nlbksl-nldef ajouterpy-undfruit(panier, fruit):bksl-nl passbksl-nlbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert ajouterpy-undfruit(panierpy-unddepy-undfruits, 'mandarine') == panierpy-unddepy-undfruitsbksl-nlassert ajouterpy-undfruit(panierpy-unddepy-undfruits, 'pomme')['pomme'] == 1bksl-nlpanierpy-unddepy-undfruits = {'pomme' : 0, 'poire' : 0, 'abricot' : 0}bksl-nlbksl-nldef ajouterpy-undfruit(panier, fruit):bksl-nl if fruit not in panier:bksl-nl print("Ce fruit n'est pas sur la liste de courses")bksl-nl else :bksl-nl panier[fruit] = panier[fruit] + 1bksl-nl return panierbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert ajouterpy-undfruit(panierpy-unddepy-undfruits, 'mandarine') == panierpy-unddepy-undfruitsbksl-nlassert ajouterpy-undfruit(panierpy-unddepy-undfruits, 'pomme')['pomme'] == 1bksl-nlfor i in range(10):bksl-nl assert ajouterpy-undfruit(panierpy-unddepy-undfruits, 'poire')['poire'] == i+1bksl-nl

Exercice 5

Continuons encore sur ce panier de fruits.

En utilisant la fonction ajouter_fruit et une boucle, créer une fonction avalanche_de_fruits qui prend en paramètres un dictionnaire panier et qui ajoute 1 à la quantité de tous les fruits présents dans le dictionnaire panier.

panierpy-unddepy-undfruits = {'pomme' : 2, 'poire' : 3, 'abricot' : 1}bksl-nlassert avalanchepy-unddepy-undfruits(panierpy-unddepy-undfruits) == {'pomme' : 3, 'poire' : 4, 'abricot' : 2}bksl-nlbksl-nl 5/5
#--- HDR ---#bksl-nldef ajouterpy-undfruit(panier, fruit):bksl-nl if fruit not in panier:bksl-nl print("Ce fruit n'est pas sur la liste de courses")bksl-nl else :bksl-nl panier[fruit] = panier[fruit] + 1bksl-nl return panierbksl-nl#--- HDR ---#bksl-nlbksl-nlpanierpy-unddepy-undfruits = {'pomme' : 2, 'poire' : 3, 'abricot' : 1}bksl-nlbksl-nldef avalanchepy-unddepy-undfruits(panier):bksl-nl passbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert avalanchepy-unddepy-undfruits(panierpy-unddepy-undfruits) == {'pomme' : 3, 'poire' : 4, 'abricot' : 2}bksl-nlpanierpy-unddepy-undfruits = {'pomme' : 2, 'poire' : 3, 'abricot' : 1}bksl-nlbksl-nldef ajouterpy-undfruit(panier, fruit):bksl-nl if fruit not in panier:bksl-nl print("Ce fruit n'est pas sur la liste de courses")bksl-nl else :bksl-nl panier[fruit] = panier[fruit] + 1bksl-nl return panierbksl-nlbksl-nldef avalanchepy-unddepy-undfruits(panier):bksl-nl for fruit in panier:bksl-nl panier = ajouterpy-undfruit(panier, fruit)bksl-nl return panierbksl-nlbksl-nlbksl-nl# Testsbksl-nlassert avalanchepy-unddepy-undfruits(panierpy-unddepy-undfruits) == {'pomme' : 3, 'poire' : 4, 'abricot' : 2}bksl-nl

8.4 Parcours particuliers⚓︎

Cours

De temps en temps, on souhaite parcourir les valeurs plutôt que les clés. On réalise cette opération à l'aide de la syntaxe suivante :

for valeur in un_dictionnaire.values():
    print(valeur)
Exemple

Faire la moyenne des valeurs du dictionnaire :

moyennepy-undFV = {'1G1' : 12, '1G2' : 14.3, '1G3' : 15.6, '1G4' : 11.3}bksl-nlbksl-nlbksl-nl

Solution

```python moyenne_FV = {'1G1' : 12, '1G2' : 14.3, '1G3' : 15.6, '1G4' : 11.3}

moyenne = 0 for note in moyenne_FV.values(): moyenne = moyenne + note / len(moyenne_FV)

print(moyenne)

De temps en temps, on souhaite parcourir les clés et les valeurs simultanément. On réalise cette opération à l'aide de la syntaxe suivante :

for clé, valeur in un_dictionnaire.items():
    print(clé, valeur)
Retour en haut de la page