#!/usr/bin/env python # coding: utf-8 # # Les dictionnaires # # > les dictionnaires en python # # - toc: true # - badges: true # - comments: false # - categories: [python, ISN] # Les dictionnaires sont des objets pouvant en contenir d'autres, un peu comme des listes. # # Cependant, au lieu d'héberger des informations dans un ordre précis, ils associent chaque ***valeur*** contenue à une ***clé*** (qui peut être une chaîne de caractère ou simplement un nombre). # # Voyons tout de suite un exemple : # In[ ]: coeffBacS={"ISN":2,"Maths":7} # Dans l'exemple ci-dessus, nous avons créé un dictionnaire ***coeffBacS***. Nous voyons tout de suite que : # - le caractère servant à délimiter le dictionnaire est l'accolade { }, ce qui le distingue des listes délimitées par des crochets. # - Il contient deux valeurs : 2 et 7 # - Il contient deux clés : "ISN" et "Maths" # ## Accéder à une valeur du dictionnaire # Contrairement aux listes ou on accède aux valeurs par la position dans la liste, on accède aux valeurs du dictionnaire par l'intermédiaire des ***clés***. Regardez l'exemple ci-dessous : # In[ ]: coeffBacS["ISN"] # La ressemblance avec les listes pour accéder aux données est assez frappante. # # **Attention** à bien utiliser une clé qui a été définie, sinon... # In[ ]: coeffBacS["MATHS"] # Ici la clé ***MATHS*** n'existe pas. En effet le système est sensible aux majuscules ! # ## Savoir si une clé existe dans un dictionnaire # Pour éviter ce type d'erreur, on peut tester l'existance d'une clé par le mot clé Python ***in*** # In[ ]: "MATHS" in coeffBacS # In[ ]: "ISN" in coeffBacS # ## Ajouter des données à un dictionnaire # L'ajout de données se fait très simplement : # In[ ]: coeffBacS["Philo"]=3 # Les clés peuvent être de type différents, ainsi que les données : # In[ ]: coeffBacS["Philo"] # **Remarque** : les clés ne sont pas nécessairement du type chaîne de caractère. Tout type *non mutable* peut servir de clé. On peut très bien utiliser un nombre comme clé : # In[ ]: # on crée un dictionnaire vide autreDico=dict() # on définit des clés sous forme de nombres autreDico[3.14] = "pi" autreDico[2.718] = "e" # il est possible de mélanger les types de clés # mais ce n'est pas forcément une bonne idée ! autreDico["pi"] = 3.1415 # In[ ]: autreDico[3.14] # In[ ]: autreDico["pi"] # ## Parcourir un dictionnaire # Pour parcourir un dictiionnaire, on va utiliser les méthodes # - ***keys()*** pour récupérer la liste des clés # - ***values()*** pour récupérer la liste des valeurs # # Par exemple, affichons toutes les valeurs contenues dans notre dictionnaire # In[ ]: coeffBacS.values() # et de même pour les clés : # In[ ]: coeffBacS.keys() # Pour parcourir un dictionnaire par clés, il suffit de faire une boucle du type : # # In[ ]: for matiere in coeffBacS.keys(): print(matiere , " coeff ", coeffBacS[matiere]) # Complétons notre dictionnaire .... # In[ ]: coeffBacS["Francais Oral"]=2 coeffBacS["Physique Chimie"]=6 coeffBacS["SVT"]=6 coeffBacS["HGéo"]=3 coeffBacS["LV1"]=3 coeffBacS["TPE"]=2 # ## Supprimer une clé # # On peut supprimer une clé (et sa valeur correspondante) d'un dictionnaire en utilisant, au choix, la méthode **del** ou la méthode **pop**. # In[ ]: coeffBacS.pop("Physique Chimie") # In[ ]: coeffBacS["Physique Chimie"] # # A vous de jouer... # Ecrire une fonction **bacS** prenant en paramètre un dictionnaire dont les valeurs sont les coefficients et qui renvoie la somme des coefficients des matières du bac. # In[ ]: def bacS(dico): # YOUR CODE HERE raise NotImplementedError() # In[ ]: dicoTest = coeffBacS={"ISN":2,"Maths":7, "Francais Oral":2, "Physique Chimie":6, "SVT":6, "HGéo":3, "LV1":3, "TPE":2} assert bacS(dicoTest) == 31 # ## Exercice # Ecrire une fonction **dicoCarres** prenant en paramètre un entier $n$ et renvoyant un dictionnaire dont les clés sont les entiers de 1 à $n$ et les valeurs sont les carrés de ces nombres # In[ ]: def dicoCarres(n): # YOUR CODE HERE raise NotImplementedError() # In[ ]: d = dicoCarres(10) assert d[5] == 25 # Ecrire une fonction **inverseDico** prenant en paramètre un dicitonnaire ***d*** et renvoyant un dictionnaire dont les clés sont les valeurs de ***d*** et les valeurs sont les clés correspondantes. # # On supposera que les clés et les valeurs sont uniques (comme dans notre dictionnaire des carrés) pour simplifier la tâche. # In[ ]: def inverseDico(d): # YOUR CODE HERE raise NotImplementedError() # In[ ]: d = dicoCarres(10) i = inverseDico(d) assert i[64] == 8 # In[ ]: