Un diccionario (dict) en Python es una estructura de datos que asocia claves hashable con valores, y en otros lenguajes de programación se conoce como tabla hash redimensionable, hashmap o array asociativo.
Los diccionarios son el único tipo de mapeo integrado de Python.
Las Keys deben ser hashables y únicas en todo el diccionario.
Los tipos de clave pueden incluir numbers, str o tuples (de valores inmutables).
No pueden contener estructuras de datos mutables como lists, dicts o sets.
A partir de Python 3.7, se garantiza que el orden de las claves de un dict es el orden en que se insertan las entradas.
Los values pueden ser de cualquier tipo o estructura de datos.
Los valores también pueden anidarse de forma arbitraria, así que pueden incluir listas de listas, subdiccionarios y otras estructuras de datos personalizadas o compuestas.
Dado un key, los diccionarios pueden recuperar un value en tiempo constante (en promedio), independientemente del número de entradas.
En comparación con buscar un valor dentro de un list o array (sin conocer la posición del index), un dict usa bastante más memoria, pero su recuperación es muy rápida.
Los diccionarios son especialmente útiles en escenarios donde la colección de elementos es grande y se debe acceder a ella y actualizarla con frecuencia.
Los diccionarios se pueden crear de muchas maneras.
Las dos más directas son usar el constructor dict() o declarar un literal de dict.
dict()
dict() (el constructor de la clase diccionario) se puede usar con cualquier iterable de pares key, value o con una serie de argumentos <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 también se puede escribir directamente como un literal de diccionario, usando llaves ({}) que encierran pares key : value:
>>> whale = {"name": "Blue Whale", "speed": 35, "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}
Puedes acceder a una entrada de un diccionario usando una clave entre corchetes ([]).
Si un key no existe en el dict, se lanza un KeyError:
>>> bear["speed"]
40
>>> bear["color"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'color'
Acceder a una entrada mediante el método .get(<key>, <default value>) puede evitar el KeyError:
>>> bear.get("color", 'not found')
'not found'
Puedes cambiar el value de una entrada asignando a su clave:
#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}
Los nuevos pares key:value se pueden agregar de la misma forma:
# 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}
Puedes usar el método .pop(<key>) para eliminar una entrada del diccionario.
.pop() elimina el par (key, value) y devuelve el value para que lo uses.
Al igual que .get(), .pop(<key>) acepta un segundo argumento (dict.pop(<key>, <default value>)) que se devolverá si no se encuentra el key.
Esto evita que se lance un KeyError:
#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'
Recorrer un diccionario con for item in dict o while item iterará de forma predeterminada solo sobre las claves.
Puedes acceder a los valores dentro del mismo bucle usando corchetes:
>>> 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)
También puedes usar el método .items(), que devuelve tuplas (key, value) automáticamente:
#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 manera similar, el método .keys() devolverá keys y el método .values() devolverá values.
En este ejercicio, vas a administrar un sistema de inventario.
El inventario debe estar organizado por el nombre del artículo y debe llevar un registro de la cantidad de artículos disponibles.
Tendrás que encargarte de agregar artículos a un inventario.
Cada vez que un artículo aparece en una lista dada, la cantidad de ese artículo en el inventario debe aumentar en 1.
También tendrás que encargarte de eliminar artículos de un inventario disminuyendo las cantidades en 1 cuando se te pida.
Finalmente, tendrás que implementar una función que devuelva todos los pares clave-valor de un inventario dado como una list de tuples.
Implementa la función create_inventory(<input list>) que crea un «inventario» a partir de una lista de artículos de entrada.
Debe devolver un dict que contenga cada nombre de artículo junto con su cantidad respectiva.
>>> create_inventory(["coal", "wood", "wood", "diamond", "diamond", "diamond"])
{"coal":1, "wood":2, "diamond":3}
Implementa la función add_items(<inventory dict>, <item list>) que agrega una lista de artículos al inventario que recibe:
>>> add_items({"coal":1}, ["wood", "iron", "coal", "wood"])
{"coal":2, "wood":2, "iron":1}
Implementa la función decrement_items(<inventory dict>, <items list>) que recibe una list de artículos.
Tu función debe quitar 1 al conteo de un artículo por cada vez que ese artículo aparezca en la list:
>>> decrement_items({"coal":3, "diamond":1, "iron":5}, ["diamond", "coal", "iron", "iron"])
{"coal":2, "diamond":0, "iron":3}
No se debe permitir que los conteos de artículos en el inventario caigan por debajo de 0.
Si el número de veces que un artículo aparece en la list de entrada supera el conteo disponible, la cantidad registrada para ese artículo debe permanecer en 0.
Las solicitudes adicionales para quitar conteos deben ignorarse una vez que el conteo llegue a cero.
>>> decrement_items({"coal":2, "wood":1, "diamond":2}, ["coal", "coal", "wood", "wood", "diamond"])
{"coal":0, "wood":0, "diamond":1}
Implementa la función remove_item(<inventory dict>, <item>) que elimina por completo un artículo y su conteo de un inventario:
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "coal")
{"wood":1, "diamond":2}
Si el artículo no se encuentra en el inventario, la función debe devolver el inventario original sin cambios.
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "gold")
{"coal":2, "wood":1, "diamond":2}
Implementa la función list_inventory(<inventory dict>) que recibe un inventario y devuelve una lista de tuplas (item, quantity).
La lista solo debe incluir los artículos disponibles (con una cantidad mayor que cero):
>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.