Diccionarios en Python: Propiedades, Operaciones, Metodos y mas
Todos los tipos de datos que hemos visto hasta el momento en el tutorial Python desde cero (cadenas, listas, tuplas), son de tipo secuencia y podemos acceder a sus valores a través de sus índices como vimos en las entradas anteriores.
Diccionarios en Python
Las claves son únicas en los diccionarios, pero el valor no tiene porque. Los valores de un diccionario pueden ser de cualquier tipo, pero las claves deben ser de un tipo de datos inmutables como las cadenas, números o tuplas.
Como ejemplo crearemos un diccionario para traducir palabras del ingles al español. Para este diccionario las claves serán cadenas:
>>> eng2sp = {}
>>> eng2sp["one"] = "uno"
>>> eng2sp["two"] = "dos"
La primera línea crea crea un diccionario llamado eng2sp, las otras asignaciones crean nuevos pares clave:valor al diccionario. Podemos imprimir el valor actual del diccionario como lo hacemos habitualmente:
>>> print(eng2sp)
{"two": "dos", "one": "uno"}
Como podemos observar, los valores del diccionario quedan separados por una coma.
El orden de los elementos en el diccionario puede que no sea el esperado porque Python utiliza algoritmos complejos para determinar donde se almacenan los pares clave:valor en un diccionario. Podríamos decir que este ordenamiento es impredecible.
Acceder a los valores de un diccionario
Para acceder a los elementos de un diccionario, podemos utilizar el nombre del diccionario junto con su clave para acceder al valor. Veremos un ejemplo sencillo:
>>> print eng2sp["one"], eng2sp["two"]
uno dos
Si intentamos acceder a un elemento del diccionario con una clave que no existe para ese diccionario nos saldrá un error como este:
>>> print eng2sp["six"]
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
print eng2sp["six"]
KeyError: 'six'
Hashing
Podrías estar preguntándote porque utilizar diccionarios si el concepto de clave:valor podría ser implementado utilizando una lista de tuplas:
>>> {"Manzanas": 430, "Bananas": 312, "Naranjas": 525, "Peras": 217}
{'Peras': 217, 'Manzanas': 430, 'Naranjas': 525, 'Bananas': 312}
>>> [('Manzanas', 430), ('Bananas', 312), ('Naranjas', 525), ('Peras', 217)]
[('Manzanas', 430), ('Bananas', 312), ('Naranjas', 525), ('Peras', 217)]
La razón es porque los diccionarios son mucho más rápidos, implementan una técnica llamada Hashing, que nos permite acceder a un valor rápidamente. Por el contrario, la búsqueda en una lista de tuplas sería mas lenta. Si queremos buscar un valor asociado a una clave, tendríamos que iterar sobre cada tupla para encontrar el elemento. Y si la llave no estuviera en la lista tendríamos que llegar hasta el último elemento para averiguarlo.
Otra forma de crear un diccionario es proporcionar una lista de pares clave:valor como en ejemplo anterior:
>>> eng2sp = {"one": "uno", "two": "dos", "three": "tres"}
Vuelvo a repetir, no importa con que orden escribamos los pares, los valores en un diccionario se acceden por su clave, no con índices, por lo que no deberíamos preocuparnos por el orden.
Actualizar y agregar elementos en un diccionario
Podemos cambiar valores de los elementos, agregar nuevos pares clave:valor y también eliminarlos. A continuación muestro un ejemplo de todo lo dicho anteriormente, se crea un diccionario con varias frutas y el stock correspondiente:
>>> inventario = {"manzanas": 430, "bananas": 312, "naranjas": 525, "peras": 217}
>>> print(inventario)
{'peras': 217, 'manzanas': 430, 'naranjas': 525, 'bananas': 312}
Si alguien compra todas las peras podríamos quitar la entrada del diccionario:
>>> del inventario["peras"]
>>> print(inventario)
{'manzanas': 430, 'naranjas': 525, 'bananas': 312}
O si pronto esperamos que vengan más peras, podríamos cambiar el valor asociado de las peras para no eliminarlo:
>>> inventario["peras"] = 0
>>> print(inventario)
{'peras': 0, 'manzanas': 430, 'naranjas': 525, 'bananas': 312}
Para un nuevo envío de Bananas podríamos hacer lo siguiente:
>>> inventario["bananas"] += 200
>>> print(inventario)
{'peras': 0, 'manzanas': 430, 'naranjas': 525, 'bananas': 512}
La función len también nos será útil para trabajar con los diccionarios. Devuelve en número de pares clave:valor
>>> len(inventario)
4
Métodos que 4odemos utilizar con los diccionarios en Python
Los diccionarios tienen una serie de métodos integrados que nos serán de mucha utilidad
El método key nos devuelve una lista de todos los claves del diccionario:
>>> inventario = {"manzanas": 430, "bananas": 312, "naranjas": 525, "peras": 217}
>>> inventario.keys()
['naranjas', 'peras', 'bananas', 'manzanas']
El método values nos devuelve una lista de todos los valores del diccionario:
>>> inventario.values()
[525, 125, 217, 312, 430]
El método clear elimina todos los elementos de un diccionario:
>>> print inventario
{'naranjas': 525, 'duraznos': 125, 'peras': 217, 'bananas': 312, 'manzanas': 430}
>>> inventario.clear()
>>> print inventario
{}
El método items nos devuelve una lista de tuplas y cada tupla contiene pares clave:valor
inventario.items()
[('naranjas', 525), ('peras', 217), ('bananas', 312), ('manzanas', 430)]
Las tuplas a menudo son útiles para obtener tanto la clave como el valor al mismo tiempo mientras utilizamos un bucle:
>>> for (k,v) in inventario.items():
print("Hay",v,k, " en stock")
('Hay', 525, 'naranjas', ' en stock')
('Hay', 217, 'peras', ' en stock')
('Hay', 312, 'bananas', ' en stock')
('Hay', 430, 'manzanas', ' en stock')
El operador in y not in puede comprobar si una clave está en un diccionario:
>>> "naranjas" in inventario
True
>>> "duraznos" in inventario
False
Este método es de mucha utilidad ya que buscar una clave que no existe en un diccionario provocará un error en tiempo de ejecución:
Otra opción sería utilizar el método has_key(key) que nos devuelve True si la clave existe, de lo contrario devuelve False:
>>> inventario.has_key("bananas")
True
>>> inventario.has_key("adf")
False
Otro método muy útil es update, que nos permite agregar los elementos pares clave:valor de un diccionario dentro de otro:
>>> print inventario
{'naranjas': 525, 'peras': 217, 'bananas': 312, 'manzanas': 430}
>>> otroInventario = {"duraznos": 125}
>>> inventario.update(otroInventario)
>>> print inventario
{'naranjas': 525, 'duraznos': 125, 'peras': 217, 'bananas': 312, 'manzanas': 430}
Funciones para utilizar con diccionarios en Python
Ya mencione la función len anteriormente, pero hay algunas otras que pueden ser de mucha ayuda:
Función cmp(dicc1, dicc2) compara los elementos de ambos diccionarios
Función str(dicc) produce una representación de cadenas
-
-
IndentationError: expected an indented block Quiere decir literalmente que la identación no es correcta. Asegúrate de identar con 4 espacios en vez de usar el tabulador.
-
-
no funciona "narja" in inventario
-
Alejandro Gonzalez Duque: tienes que colocar bien las lineas:
inventario = {"manzanas": 430, "bananas": 312, "naranjas": 525, "peras": 217}
for (k,v)in inventario.items():
********* print("Hay ",v,k," en el inventario ") -
como convierto todos los datos de un diccionario en str en python
-
hola, ¿se puede crear una funcion def, que retorne como valor un diccionario?
-
"""
Recibe dos parámetros y los agrega al diccionario
llamado dicc
"""
dicc = {}def crear_dicc(valor1, valor2):
dicc[valor1] = valor2
return dicc"""
Otra opción sería que enviaras
varios valores dentro de, no lo sé,
listas y posteriormente se los pases
a la función. Es importante que ambos
tengan la misma longitud de valores
"""
my_dicc2 = {}
my_list1 = [] #Supongamos que aquí van las claves
my_list2 = [] #Supongamos que aquí van los valroesdef crear_dicc2(list1, list2):
my_dicc2 = dict(zip(list1,list2))
return my_dicc2No estoy seguro si en el segundo ejemplo, cada que llames a la función, los pares clave-valor serán sobre-escritos, pero lo más probable es que así sea.
-
Como puedo comparar los values de un diccionario y luego imprimir cual es el valor mas alto?
dic = {"llave1":[1,2,3], "llave2":[3,1,2], "llave3":[88,5,1], "llave4":[20,2,32]}
print ( ???? )
El numero más alto de "values" en la posición 0 es 88 y pertenece a la "key" llave3.
gracias
-
Hola buen dia.
sorted(dic.values())[-1] creo que eso podria ser el sorted ordena de menor a mayor y [-1] este idica el ultimo valor de la lista para que se muestre. abria que probar.
-
-
-
Cuál es el rango de un diccionario?
Deja una respuesta
buenas noches, soy nuevo en esto y he aprendido mucho siguendo este tutorial...
estaba realizando el ejercicio que explicas peron no me funciona:
for (k,v) in inventario.items():
... print("hay", v, k, "en stock")
File "", line 2
print("hay", v, k, "en stock")
^
IndentationError: expected an indented block
que es lo que estoy haciendo mal?