Google+ Seguidores

miércoles, 7 de diciembre de 2016

Diccionarios en Python: Propiedades, Operaciones, Metodos y mas

    0

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.


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

No hay comentarios:
Write comentarios

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

© 2014 Mi diario Python. Designed by Bloggertheme9 | Distributed By Gooyaabi Templates
Powered by Blogger.