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

El tipo de dato diccionario en python es compuesto. Cada clave está separada de su valor por dos puntos {:}, sus elementos separados por comas y todo va delimitado con llaves {}.

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

  1. Alejandro Gonzalez Duque dice:

    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?

    1. Anónimo dice:

      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.

  2. Anónimo dice:

    no funciona "narja" in inventario

  3. Anónimo dice:

    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 ")

  4. Unknown dice:

    como convierto todos los datos de un diccionario en str en python

  5. s1720 dice:

    hola, ¿se puede crear una funcion def, que retorne como valor un diccionario?

    1. DéboraMelTrozo dice:

      """
      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 valroes

      def crear_dicc2(list1, list2):
      my_dicc2 = dict(zip(list1,list2))
      return my_dicc2

      No 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.

    2. Unknown dice:

      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

      1. mary dice:

        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.

  6. Anónimo dice:

    Cuál es el rango de un diccionario?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey