Un diccionario (dict) en Python es una estructura de datos que asocia claves hashable a valores y se conoce en otros lenguajes de programación como tabla hash redimensionable, hashmap o array asociativo.
Los diccionarios son el único tipo de mapeo integrado de Python.
Las keys deben ser hashable 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 el que se insertan las entradas.
Los values pueden ser de cualquier tipo o estructura de datos.
Los valores también pueden anidarse arbitrariamente, por lo que pueden incluir listas de listas, subdiccionarios y otras estructuras de datos personalizadas o compuestas.
Dada una key, los diccionarios pueden recuperar un value en tiempo constante (de media) (independientemente del número de entradas).
En comparación con buscar un valor dentro de un list o un array (sin conocer la posición del index), un dict usa mucha más memoria, pero su recuperación es muy rápida.
Los diccionarios son especialmente útiles en situaciones en las que la colección de elementos es grande y hay que acceder a ella y actualizarla con frecuencia.
Los diccionarios se pueden crear de muchas formas.
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 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 una 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 añadir 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 poder usarlo.
Al igual que .get(), .pop(<key>) acepta un segundo argumento (dict.pop(<key>, <default value>)) que se devolverá si no se encuentra la 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 itera por defecto 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
Del mismo modo, el método .keys() devolverá las Keys y el método .values() devolverá los values.
En este ejercicio, vas a gestionar un sistema de inventario.
El inventario debe organizarse por el nombre del elemento y debe llevar la cuenta del número de elementos disponibles.
Tendrás que ocuparte de añadir elementos a un inventario.
Cada vez que un elemento aparece en un array dado, la cantidad de ese elemento debe aumentar en 1 en el inventario.
También tendrás que ocuparte de eliminar elementos de un inventario, disminuyendo las cantidades en 1 cuando se solicite.
Por último, 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 un array de elementos de entrada.
Debe devolver un dict que contenga el nombre de cada elemento 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 añade un array de elementos al inventario que se pasa:
>>> 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 toma una list de elementos.
Tu función debe restar 1 del recuento de un elemento por cada vez que ese elemento 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 recuentos de elementos del inventario bajen por debajo de 0.
Si el número de veces que un elemento aparece en la list de entrada supera el recuento disponible, la cantidad indicada para ese elemento debe permanecer en 0.
Las peticiones adicionales para eliminar recuentos deben ignorarse una vez que el recuento 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 un elemento y su recuento por completo de un inventario:
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "coal")
{"wood":1, "diamond":2}
Si el elemento 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 toma un inventario y devuelve un array de tuplas (item, quantity).
El array solo debe incluir los elementos 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.