Aller au contenu

Chapitre 3: les Dictionnaires⚓︎

image

1. Les dictionnaires : premiers exemples⚓︎

Une liste est un ensemble d'éléments accessibles par leur indice. Cet indice est en quelque sorte la «place» de l'élément dans la liste. On peut dire que cet indice est la clé qui permet d'accéder à l'élément.

Dans un dictionnaire, chaque élément est accessible par une clé qui n'est plus forcément un nombre : une chaine de caractère, un nombre, ou autre chose, peut être une clé.

Imaginons que je fasse l'inventaire de mon dressing :

habits quantité
pantalons 3
pulls 4
tee-shirts 8

Exemple fondateur n°1 ❤

  • La création du dictionnaire représentant mon dressing se fera par :
    🐍 Console Python
    >>> dressing = {"pantalons":3, "pulls":4, "tee-shirts":8}
    
  • L'accès à une valeur se fera par :
    🐍 Console Python
    >>> dressing["pulls"]
      4
    
  • On dit que "pulls" est la clé et que 4 est la valeur associée à la clé.

  • Un dictionnaire est un ensemble clés / valeurs.

Attention ⚠ : une clé peut aussi être un nombre :

🐍 Console Python
>>> myst = {9:4, 1:2, 6:3, 7:4} 
>>> myst[1]
2
>>> myst[7]
4 

2. Définitions et propriétés d'un dictionnaire⚓︎

2.1 Définitions⚓︎

Définition

Un dictionnaire est une donnée composite qui n'est pas ordonnée (à la différence des listes !) Il fonctionne par un système de clé:valeur.
Les clés, comme les valeurs, peuvent être de types différents. Un dictionnaire est délimité par des accolades.

Rappel :

  • crochets [ ] -> listes
  • parenthèses ( ) -> tuples
  • accolades { } -> dictionnaires

2.2 Méthodes .keys() , .values()⚓︎

Exemples fondateurs n°2 ❤

  • Pour lister les clés d'un dictionnaire :
    🐍 Console Python
    >>> dressing.keys()
    dict_keys(['pantalons', 'pulls', 'tee-shirts'])
    
  • Pour lister les valeurs d'un dictionnaire :
    🐍 Console Python
    >>> dressing.values()
    dict_values([3, 4, 8])
    

Ces méthodes sont importantes (elles figurent explicitement au programme de NSI) mais sont en pratique peu utilisées. On leur préfèrera très largement la méthode de parcours qui suit.

2.3 Parcours d'un dictionnaire ⭐ ⭐ ⭐⚓︎

Exemple fondateur n°3 ❤

  • Parcours par clés :
    🐍 Script Python
    for habit in dressing:
        print(habit)
    
    🐍 Console Python
    pantalons
    pulls
    tee-shirts            
    
  • Parcours par valeurs :
    🐍 Script Python
    for habit in dressing:
        print(dressing[habit])
    
    🐍 Console Python
    3
    4
    8
    

Observation grâce à PythonTutor

Pour parcourir un dictionnaire par items avec la méthode .items()

🐍 Script Python
for k, v in dressing.items():
    print(k, v)
🐍 Console Python
pantalons 3
pulls 4
tee-shirts 8
Cela permet d'obtenir à la fois la clé et la valeur de chaque item du dictionnaire.

2.4 Création d'un dictionnaire vide⚓︎

Exemple fondateur n°4 ❤

Deux méthodes existent pour créer un dictionnaire : dict() et {}

🐍 Console Python
>>> mondico = dict()
>>> mondico
{}
>>> mondico['john'] = 12
>>> mondico
{'john': 12}
🐍 Console Python
>>> contacts = {}
>>> contacts['bob'] = '06 12 17 21 32'

2.5 Ajout / Modification d'un élément dans un dictionnaire⚓︎

Exemple fondateur n°5 ❤

Pas besoin d'une méthode append(), il suffit de rajouter une paire clé : valeur

🐍 Console Python
>>> dressing["chaussettes"] = 12

On peut aussi modifier un dictionnaire existant.

🐍 Console Python
dressing["chaussettes"] = 11

2.6 Suppression d'une valeur⚓︎

Exemple fondateur n°6 ❤

On utilise l'instruction del (déjà rencontrée pour les listes)

🐍 Console Python
del dressing["chaussettes"]

Exercice 1

Reprenons notre dictionnaire dressing :

🐍 Script Python
dressing = {'pantalons':3, 'pulls':4, 'tee-shirts':8}
Créer une fonction achat(habit) qui augmente de 1 le nombre d'habits (pantalon, pull ou tee-shirt) de mon dressing.

🐍 Script Python
1
2
3
4
dressing = {'pantalons':3, 'pulls':4, 'tee-shirts':8}

def achat(habit):
    dressing[habit] += 1

2.7 Test d'appartenance à un dictionnaire⚓︎

Nous rencontrons un petit problème si nous tentons d'acheter un vêtement pour la 1ère fois

🐍 Console Python
>>> achat("chemises")
    ---------------------------------------------------------------------------

    KeyError                                  Traceback (most recent call last)

    <ipython-input-28-fd9d1ac5f62d> in <module>
    ----> 1 achat("chemises")


    <ipython-input-27-feb173444189> in achat(habit)
          1 def achat(habit):
    ----> 2     dressing[habit] = dressing[habit] + 1


    KeyError: 'chemises'

Nous allons résoudre ce problème grâce aux tests d'appartenance.

Exemple fondateur n°7 ❤

Le mot in permet de tester l'appartenance d'une clé à un dictionnaire. Un booléen est renvoyé.

🐍 Console Python
>>> "cravates" in dressing
  False

3. Exercices⚓︎

Exercice 2

Améliorer la fonction achat(habit) en y incluant un test pour prendre en compte les nouveaux habits.

🐍 Script Python
1
2
3
4
5
def achat(habit):
    if habit in dressing:
        dressing[habit] += 1
    else:
        dressing[habit] = 1

Exercice 3

On considère la liste suivante :

🐍 Script Python
lst = ['Emmy', 'Ahmed', 'Antoine', 'Emma', 'Louan', 'Louka', 'Louan', 'Elouo', 'Candice', 'Tristan', 'Alissa', 'Louka', 'Louka', 'Emma', 'Alissa', 'Antoine', 'Elouo', 'Louan', 'Mathias', 'Candice', 'Antoine', 'Tristan', 'Louka', 'Emma', 'Tristan', 'Mathias', 'Louan', 'Vincent', 'Vincent', 'Ahmed', 'Louka', 'Elouo', 'Ahmed', 'Elouo', 'Candice', 'Louka', 'Mathias', 'Mathias', 'Emmy', 'Candice', 'Tristan', 'Antoine', 'Mathias', 'Ahmed', 'Candice', 'Louka', 'Alissa', 'Vincent', 'Elouo', 'Vincent', 'Antoine', 'Elouo', 'Emmy', 'Hugo', 'Vincent', 'Louan', 'Emmy', 'Emma', 'Vincent', 'Louan', 'Elouo', 'Emmy', 'Emmy', 'Emma', 'Mathias', 'Elouo', 'Louka', 'Hugo', 'Emma', 'Vincent', 'Candice', 'Ahmed', 'Hugo', 'Emma', 'Candice', 'Louan', 'Louka', 'Candice', 'Emma', 'Hugo', 'Mathias', 'Tristan', 'Mathias', 'Tristan', 'Antoine', 'Antoine', 'Hugo', 'Louka', 'Mathias', 'Hugo', 'Alissa', 'Elouo', 'Louka', 'Louka', 'Alissa', 'Vincent', 'Ahmed', 'Emma', 'Hugo', 'Mathias', 'Hugo', 'Mathias', 'Antoine', 'Ahmed', 'Antoine', 'Antoine', 'Vincent', 'Ahmed', 'Candice', 'Mathias', 'Emmy', 'Mathias', 'Emma', 'Antoine', 'Tristan', 'Antoine', 'Tristan', 'Candice', 'Louka', 'Louka', 'Tristan', 'Ahmed', 'Elouo', 'Emmy', 'Antoine', 'Alissa', 'Ahmed', 'Antoine', 'Alissa', 'Louan', 'Emma', 'Elouo', 'Tristan', 'Emmy', 'Elouo', 'Louka', 'Emmy', 'Ahmed', 'Louka', 'Vincent', 'Vincent', 'Antoine', 'Ahmed', 'Ahmed', 'Vincent', 'Tristan', 'Louan', 'Emmy', 'Elouo', 'Louka', 'Emmy', 'Hugo', 'Emmy', 'Emma', 'Emma', 'Hugo', 'Louan', 'Hugo', 'Antoine', 'Ahmed', 'Emmy', 'Vincent', 'Emma', 'Candice', 'Candice', 'Louka', 'Louan', 'Alissa', 'Vincent', 'Vincent', 'Tristan', 'Louka', 'Louan', 'Louka', 'Antoine', 'Tristan', 'Alissa', 'Ahmed', 'Vincent', 'Louka', 'Alissa', 'Mathias', 'Elouo', 'Emmy', 'Ahmed', 'Emmy', 'Vincent', 'Elouo', 'Emma', 'Mathias', 'Ahmed', 'Vincent', 'Mathias', 'Candice', 'Elouo', 'Louan', 'Elouo', 'Vincent', 'Emmy', 'Emma']

Créer un dictionnaire qui associera à chaque prénom son nombre d'occurrences dans la liste.

🐍 Script Python
1
2
3
4
5
6
7
occurrence = {}

for prenom in lst:
    if prenom in occurrence:
        occurrence[prenom] += 1
    else:
        occurrence[prenom] = 1

Exercice 4

On considère la liste suivante : lst = ['5717', '1133', '5545', '4031', '6398', '2734', '3070', '1346', '7849', '7288', '7587', '6217', '8240', '5733', '6466', '7972', '7341', '6616', '5061', '2441', '2571', '4496', '4831', '5395', '8584', '3033', '6266', '2452', '6909', '3021', '5404', '3799', '5053', '8096', '2488', '8519', '6896', '7300', '5914', '7464', '5068', '1386', '9898', '8313', '1072', '1441', '7333', '5691', '6987', '5255']

Quel est le chiffre qui revient le plus fréquemment dans cette liste ?

🐍 Script Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
lst = ['5717', '1133', '5545', '4031', '6398', '2734', '3070', '1346', '7849', '7288', '7587', '6217', '8240', '5733', '6466', '7972', '7341', '6616', '5061', '2441', '2571', '4496', '4831', '5395', '8584', '3033', '6266', '2452', '6909', '3021', '5404', '3799', '5053', '8096', '2488', '8519', '6896', '7300', '5914', '7464', '5068', '1386', '9898', '8313', '1072', '1441', '7333', '5691', '6987', '5255']

occ = {}

for nombre in lst:
    for chiffre in nombre:
        if chiffre in occ:
            occ[chiffre] += 1
        else:
            occ[chiffre] = 1

# détermination du max:
occ_max = 0

for chiffre in occ:
    if occ[chiffre] > occ_max:
        occ_max = occ[chiffre]
        chiffre_max = chiffre

print(chiffre_max, 'est le chiffre le plus fréquent')
print('il apparait', occ_max, 'fois')
🐍 Console Python
3 est le chiffre le plus fréquent
il apparait 25 fois