Aller au contenu

🏁 Les dictionnaires Python⚓︎

Remarque

Cette page rappelle rapidement les outils fondamentaux sur les dictionnaires Python.

Il ne s'agit pas d'un cours exhaustif sur ce thème.

Présentation⚓︎

Un dictionnaire Python est une structure de données organisée sous forme de couples clé : valeur.

Contrairement aux listes dans lesquelles les valeurs sont identifiées par leur indice, dans un dictionnaire, une valeur est associée à une clé. Ces clés peuvent être des entiers, des chaînes de carcactères, des tuples...

Considérons par exemple le dictionnaire suivant qui contient les dates de naissances de Roméo et Juliette :

🐍 Script Python
naissances= {
    "Roméo": 20040517,
    "Juliette": 20040417
}

"Roméo" et "Juliette" sont les clés du dictionnaire, 20040517 et 20040417 les valeurs associées.

Des clés immuables ?

Lors de la construction d'un dictionnaire, Python associe à chaque clé une valeur précise. Cette association repose sur le fait que la clé ne va pas évoluer au fil de l'exécution du programme. Si c'était le cas, l'association deviendrait caduque dès que la clé est modifiée.

Les clés des dictionnaires Python doivent donc être des objets non modifiables, immuables.

Retenons pour faire simple qu'une liste ne peut pas être utilisée comme clé d'un dictionnaire (car on peut la modifier au fil du programme).

Utilisation⚓︎

On rappelle les opérations suivantes sur les dictionnaires :

Création
  • Création d'un dictionnaire vide :
🐍 Script Python
vide = { }
  • Création d'un dictionnaire « à la main » :
🐍 Script Python
animal = {"nom": "Oli","espèce": "Chat","jour": 10,"mois": "juin","année": 2020}
Lecture de valeur

Les valeurs sont identifiées par leur clé. On accède à une valeur en utilisant des crochets :

🐍 Console Python
>>> repertoire = {"firstname": "Clarissa","lastname": "Dalloway","day": 14,"month": "May","year": 1925}
>>> repertoire["firstname"]
'Clarissa'
>>> repertoire["day"]
14
Modification de valeur
  • On modifie ou l'on ajoute des valeurs avec une simple affectation :
🐍 Console Python
>>> echiquier = {(0, 0): "Roi blanc", (5, 1): "Roi noir"}
>>> echiquier[(0, 0)] = None
>>> echiquier[(0, 1)] = "Roi blanc"
>>> echiquier
{(0, 0): None, (5, 1): 'Roi noir', (0, 1): 'Roi blanc'}

Exercices⚓︎

QCM

On considère le dictionnaire ci-dessous décrivant une liste de courses :

🐍 Script Python
courses = {
    "pommes": 1.5,
    "huile": "une bouteille d'huile d'olive",
    "légumes" : {"poireaux": (1, "kg"), "potimarron": (5, "unité")}
}

Cochez la ou les bonnes réponses :

  • Le dictionnaire courses contient cinq couples (clé: valeur)
  • "huile" est une clé
  • "légumes" est une valeur
  • courses[1.5] vaut "pommes"
  • On accède à la quantité de poireaux en faisant courses["poireaux"][0]
  • ❌ Le dictionnaire courses ne contient que trois clés : "pommes", "huile" et "légumes"
  • ✅ "huile" est une clé
  • ❌ "légumes" est une clé
  • ❌ courses[1.5] lève une erreur car 1.5 n'est pas une clé
  • ❌ On accède à la quantité de poireaux en faisant courses["légumes"]["poireaux"][0]
Départements

On fournit ci-dessous le dictionnaire dont les clés sont les noms des départements français et les valeurs, la superficie en km² de chacun d'eux.

🐍 Script Python
departements = {
    "Ain": 5762,
    "Aisne": 7362,
    ...
    "Guyane": 83534,
    "La Réunion": 2504,
}

Ces valeurs sont déjà chargées en mémoire et n'apparaissent donc pas dans l'éditeur.

Il est possible de parcourir les dictionnaires afin de créer des listes en compréhension. Par exemple [departements[nom] for nom in departements] renvoie la liste contenant la surface de chaque département.

Compléter le code ci-dessous afin d'effectuer les requêtes demandées. L'ordre des résultat au sein de chaque liste n'est pas important.

###
# Testsbksl-nl# listepy-und1 contient tous les noms des départementsbksl-nlattendu = [nom for nom in departements]bksl-nlassert listepy-und1 == attendu, "Erreur sur la liste 1"bksl-nlbksl-nl# listepy-und2 contient toutes les surfaces des départementsbksl-nlattendu = [departements[nom] for nom in departements]bksl-nlassert listepy-und2 == attendu, "Erreur sur la liste 2"bksl-nlbksl-nl# listepy-und3 contient les noms des départementsbksl-nl# strictement mesurant moins de 1000 km²bksl-nlattendu = [nom for nom in departements if departements[nom] < 1000]bksl-nlassert listepy-und3 == attendu, "Erreur sur la liste 3"bksl-nlbksl-nl# listepy-und4 contient les surfaces des départementsbksl-nl# dont le nom contient la chaîne "Seine"bksl-nlattendu = [departements[nom] for nom in departements if "Seine" in nom]bksl-nlassert listepy-und4 == attendu, "Erreur sur la liste 4"bksl-nlbksl-nl# listepy-und5 contient les noms des départementsbksl-nl# dont le nom débute par un "S"bksl-nl# et la surface est comprise entre 5 000 et 7 000 km²bksl-nlattendu = [nom for nom in departements if nom[0] == "S" and 5000 <= departements[nom] <= 7000]bksl-nlassert listepy-und5 == attendu, "Erreur sur la liste 5"bksl-nlbksl-nl 10/10
# --- HDR ---#bksl-nldepartements = {bksl-nl "Ain": 5762,bksl-nl "Aisne": 7362,bksl-nl "Allier": 7340,bksl-nl "Alpes-de-Haute-Provence": 6925,bksl-nl "Hautes-Alpes": 5549,bksl-nl "Alpes-Maritimes": 4299,bksl-nl "Ardèche": 5529,bksl-nl "Ardennes": 5229,bksl-nl "Ariège": 4890,bksl-nl "Aube": 6004,bksl-nl "Aude": 6139,bksl-nl "Aveyron": 8735,bksl-nl "Bouches-du-Rhône": 5088,bksl-nl "Calvados": 5548,bksl-nl "Cantal": 5726,bksl-nl "Charente": 5956,bksl-nl "Charente-Maritime": 6864,bksl-nl "Cher": 7235,bksl-nl "Corrèze": 5857,bksl-nl "Corse 8": 680,bksl-nl "Côte-d'Or": 8763,bksl-nl "Côtes-d'Armor": 6878,bksl-nl "Creuse": 5565,bksl-nl "Dordogne": 9060,bksl-nl "Doubs": 5233,bksl-nl "Drôme": 6530,bksl-nl "Eure": 6040,bksl-nl "Eure-et-Loir": 5880,bksl-nl "Finistère": 6733,bksl-nl "Gard": 5853,bksl-nl "Haute-Garonne": 6309,bksl-nl "Gers": 6291,bksl-nl "Gironde": 9976,bksl-nl "Hérault": 6101,bksl-nl "Ille-et-Vilaine": 6775,bksl-nl "Indre": 6791,bksl-nl "Indre-et-Loire": 6127,bksl-nl "Isère": 7432,bksl-nl "Jura": 4999,bksl-nl "Landes": 9243,bksl-nl "Loir-et-Cher": 6343,bksl-nl "Loire": 4781,bksl-nl "Haute-Loire": 4977,bksl-nl "Loire-Atlantique": 6809,bksl-nl "Loiret": 6775,bksl-nl "Lot": 5217,bksl-nl "Lot-et-Garonne": 5361,bksl-nl "Lozère": 5167,bksl-nl "Maine-et-Loire": 7172,bksl-nl "Manche": 5938,bksl-nl "Marne": 8169,bksl-nl "Haute-Marne": 6211,bksl-nl "Mayenne": 5175,bksl-nl "Meurthe-et-Moselle": 5246,bksl-nl "Meuse": 6211,bksl-nl "Morbihan": 6823,bksl-nl "Moselle": 6216,bksl-nl "Nièvre": 6817,bksl-nl "Nord": 5743,bksl-nl "Oise": 5860,bksl-nl "Orne": 6103,bksl-nl "Pas-de-Calais": 6671,bksl-nl "Puy-de-Dôme": 7970,bksl-nl "Pyrénées-Atlantiques": 7645,bksl-nl "Hautes-Pyrénées": 4464,bksl-nl "Pyrénées-Orientales": 4116,bksl-nl "Bas-Rhin": 4755,bksl-nl "Haut-Rhin": 3525,bksl-nl "Rhône": 3249,bksl-nl "Haute-Saône": 5360,bksl-nl "Saône-et-Loire": 8575,bksl-nl "Sarthe": 6206,bksl-nl "Savoie": 6028,bksl-nl "Haute-Savoie": 4388,bksl-nl "Paris": 105,bksl-nl "Seine-Maritime": 6278,bksl-nl "Seine-et-Marne": 5915,bksl-nl "Yvelines": 2284,bksl-nl "Deux-Sèvres": 5999,bksl-nl "Somme": 6170,bksl-nl "Tarn": 5758,bksl-nl "Tarn-et-Garonne": 3718,bksl-nl "Var": 5973,bksl-nl "Vaucluse": 3567,bksl-nl "Vendée": 6720,bksl-nl "Vienne": 6990,bksl-nl "Haute-Vienne": 5520,bksl-nl "Vosges": 5874,bksl-nl "Yonne": 7427,bksl-nl "Territoire de Belfort": 609,bksl-nl "Essonne": 1804,bksl-nl "Hauts-de-Seine": 176,bksl-nl "Seine-Saint-Denis": 236,bksl-nl "Val-de-Marne": 245,bksl-nl "Val-d'Oise": 1246,bksl-nl "Guadeloupe": 1628,bksl-nl "Martinique": 1128,bksl-nl "Guyane": 83534,bksl-nl "La Réunion": 2504,bksl-nl}bksl-nl# --- HDR ---#bksl-nl# listepy-und1 contient tous les noms des départementsbksl-nllistepy-und1 = ...bksl-nlbksl-nl# listepy-und2 contient toutes les surfaces des départementsbksl-nllistepy-und2 = ...bksl-nlbksl-nl# listepy-und3 contient les noms des départementsbksl-nl# strictement mesurant moins de 1000 km²bksl-nllistepy-und3 = ...bksl-nlbksl-nl# listepy-und4 contient les surfaces des départementsbksl-nl# dont le nom contient la chaîne "Seine"bksl-nllistepy-und4 = ...bksl-nlbksl-nl# listepy-und5 contient les noms des départementsbksl-nl# dont le nom débute par un "S"bksl-nl# et la surface est comprise entre 5 000 et 7 000 km²bksl-nllistepy-und5 = ...bksl-nlbksl-nl# listepy-und1 contient tous les noms des départementsbksl-nllistepy-und1 = [nom for nom in departements]bksl-nlbksl-nl# listepy-und2 contient toutes les surfaces des départementsbksl-nllistepy-und2 = [departements[nom] for nom in departements]bksl-nlbksl-nl# listepy-und3 contient les noms des départements bksl-nl# strictement mesurant moins de 1000 km²bksl-nllistepy-und3 = [nom for nom in departements if departements[nom] < 1000]bksl-nlbksl-nl# listepy-und4 contient les surfaces des départementsbksl-nl# dont le nom contient la chaîne "Seine"bksl-nllistepy-und4 = [departements[nom] for nom in departements if "Seine" in nom]bksl-nlbksl-nl# listepy-und5 contient les noms des départementsbksl-nl# dont le nom débute par un "S"bksl-nl# et la surface est comprise entre 5 000 et 7 000 km²bksl-nllistepy-und5 = [nom for nom in departements if nom[0] == "S" and 5000 <= departements[nom] <= 7000]bksl-nl

A

Z