Un dictionnaire (dict) en Python est une structure de données qui associe des clés hachables à des valeurs, et que l'on connaît dans d'autres langages de programmation sous les noms de table de hachage redimensionnable, de hashmap ou de tableau associatif.
Les dictionnaires sont le seul type de correspondance intégré à Python.
Keys doivent être hachables et uniques au sein du dictionnaire.
Les types de clés peuvent inclure des numbers, des str ou des tuples (de valeurs immuables).
Elles ne peuvent pas contenir de structures de données mutables telles que des lists, des dict ou des set.
Depuis Python 3.7, l'ordre des clés d'un dict correspond à l'ordre d'insertion des entrées.
Les values peuvent être de n'importe quel type ou structure de données.
Les valeurs peuvent aussi s'imbriquer arbitrairement, et donc contenir des listes de listes, des sous-dictionnaires et d'autres structures de données personnalisées ou composites.
Étant donné une key, un dictionnaire peut retrouver une value en temps constant (en moyenne), indépendamment du nombre d'entrées.
Comparé à la recherche d'une valeur dans une list ou un array (sans connaître la position de l'index), un dict utilise nettement plus de mémoire, mais la récupération est très rapide.
Les dictionnaires sont particulièrement utiles lorsque la collection d'éléments est volumineuse et doit être consultée et mise à jour fréquemment.
On peut créer un dictionnaire de bien des façons.
Les deux plus directes consistent à utiliser le constructeur dict() ou à déclarer un littéral dict.
dict()
dict() (le constructeur de la classe dictionnaire) peut s'utiliser avec n'importe quel itérable de paires key, value, ou avec une série d'arguments <name>=<value> :
#Passing a list of key,value tuples.
>>> wombat = dict([('name', 'Wombat'),('speed', 23),('land_animal', True)])
{'name': 'Wombat', 'speed': 23, 'land_animal': True}
#Using key=value arguments.
>>> bear = dict(name="Black Bear", speed=40, land_animal=True)
{'name': 'Black Bear', 'speed': 40, 'land_animal': True}
Un dict peut aussi s'écrire directement sous forme de littéral de dictionnaire, à l'aide d'accolades ({}) encadrant des paires key : value :
>>> whale = {"name": "Blue Whale", "speed": 35, "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}
On accède à une entrée d'un dictionnaire à l'aide d'une clé entre crochets ([]).
Si une key n'existe pas dans le dict, une KeyError est levée :
>>> bear["speed"]
40
>>> bear["color"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'color'
Accéder à une entrée via la méthode .get(<key>, <default value>) permet d'éviter la KeyError :
>>> bear.get("color", 'not found')
'not found'
On peut modifier la value d'une entrée en affectant à sa clé :
#Assigning the value "Grizzly Bear" to the name key.
>>> bear["name"] = "Grizzly Bear"
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True}
>>> whale["speed"] = 25
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False}
De nouvelles paires key:value peuvent être ajoutées de la même manière :
# Adding a new "color" key with a new "tawney" value.
>>> bear["color"] = 'tawney'
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True, 'color': 'tawney'}
>>> whale["blowholes"] = 1
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False, 'blowholes': 1}
pop) des entrées d'un dictionnaireOn peut utiliser la méthode .pop(<key>) pour supprimer une entrée d'un dictionnaire.
.pop() retire la paire (key, value) et renvoie la value pour utilisation.
Comme .get(), .pop(<key>) accepte un second argument (dict.pop(<key>, <default value>)) qui sera renvoyé si la key est introuvable.
Cela évite qu'une KeyError soit levée :
#Using .pop() removes both the key and value, returning the value.
>>> bear.pop("name")
'Grizzly Bear'
#The "name" key is now removed from the dictionary.
#Attempting .pop() a second time will throw a KeyError.
>>> bear.pop("name")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
#Using a default argument with .pop() will prevent a KeyError from a missing key.
>>> bear.pop("name", "Unknown")
'Unknown'
Parcourir un dictionnaire avec for item in dict ou while item n'itère que sur les clés par défaut.
On peut accéder aux valeurs dans la même boucle en utilisant des crochets :
>>> for key in bear:
>>> print((key, bear[key])) #this forms a tuple of (key, value) and prints it.
('name', 'Black Bear')
('speed', 40)
('land_animal', True)
On peut aussi utiliser la méthode .items(), qui renvoie automatiquement des tuples (key, value) :
#dict.items() forms (key, value tuples) that can be unpacked and iterated over.
>>> for key, value in whale.items():
>>> print(key, ":", value)
name : Blue Whale
speed : 25
land_animal : False
blowholes : 1
De même, la méthode .keys() renvoie les keys et la méthode .values() renvoie les values.
Dans cet exercice, tu vas gérer un système d'inventaire.
L'inventaire doit être organisé par nom d'article et garder la trace du nombre d'articles disponibles.
Tu devras gérer l'ajout d'articles à un inventaire.
Chaque fois qu'un article apparaît dans une liste donnée, sa quantité dans l'inventaire doit être augmentée de 1.
Tu devras aussi gérer la suppression d'articles d'un inventaire en diminuant les quantités de 1 lorsque c'est demandé.
Enfin, tu devras implémenter une fonction qui renvoie toutes les paires clé-valeur d'un inventaire donné sous la forme d'une list de tuples.
Implémente la fonction create_inventory(<input list>) qui crée un « inventaire » à partir d'une liste d'articles en entrée.
Elle doit renvoyer un dict contenant chaque nom d'article associé à sa quantité respective.
>>> create_inventory(["coal", "wood", "wood", "diamond", "diamond", "diamond"])
{"coal":1, "wood":2, "diamond":3}
Implémente la fonction add_items(<inventory dict>, <item list>) qui ajoute une liste d'articles à l'inventaire passé en argument :
>>> add_items({"coal":1}, ["wood", "iron", "coal", "wood"])
{"coal":2, "wood":2, "iron":1}
Implémente la fonction decrement_items(<inventory dict>, <items list>) qui prend une list d'articles.
La fonction doit retirer 1 au compteur d'un article chaque fois que cet article apparaît dans la list :
>>> decrement_items({"coal":3, "diamond":1, "iron":5}, ["diamond", "coal", "iron", "iron"])
{"coal":2, "diamond":0, "iron":3}
Les compteurs d'articles dans l'inventaire ne doivent pas pouvoir descendre en dessous de 0.
Si le nombre de fois qu'un article apparaît dans la list d'entrée dépasse le compteur disponible, la quantité indiquée pour cet article doit rester à 0.
Les demandes de retrait supplémentaires doivent être ignorées une fois que le compteur atteint zéro.
>>> decrement_items({"coal":2, "wood":1, "diamond":2}, ["coal", "coal", "wood", "wood", "diamond"])
{"coal":0, "wood":0, "diamond":1}
Implémente la fonction remove_item(<inventory dict>, <item>) qui supprime entièrement un article et son compteur d'un inventaire :
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "coal")
{"wood":1, "diamond":2}
Si l'article n'est pas trouvé dans l'inventaire, la fonction doit renvoyer l'inventaire d'origine inchangé.
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "gold")
{"coal":2, "wood":1, "diamond":2}
Implémente la fonction list_inventory(<inventory dict>) qui prend un inventaire et renvoie une liste de tuples (item, quantity).
La liste ne doit inclure que les articles disponibles (dont la quantité est supérieure à zéro) :
>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
Inscris-toi sur Exercism pour apprendre et maîtriser Python avec 17 concepts146 exercices, et un vrai mentorat humain, le tout gratuitement.