Diccionario / Mapa

Introducción

Ya describimos, de hecho, el concepto de diccionario, en nuestra introducción a lo que era un TDA. En general hacemos esto, porque el diccionario es una estructura "compleja" (pero no tanto), que no existe en los lenguajes como C. En cambio, si comenzáramos hablando de TDA con Lista, quizás lo confundirían con el array en C.

Entonces, no vamos a decir mucho más acá que un Diccionario, a veces llamado Mapa en algunos lenguajes es:

    • Una estructura para programación general que...
    • contiene un número dinámico de entradas
    • cada entrada tiene una clave única y un valor asociado.
    • Se puede agregar una nueva entrada, eliminar, cambiar su valor.

Veamos cómo se utilizan en Python.

Dicho sea de paso, si quieren ejercitar aún más la idea de TDA, punteros, etc en C, podría ser un lindo ejercicio el implementar el TDA diccionario en C.

Diccionario en Python

En Python este tipo ya existe, demos gracias, y de hecho el lenguaje tiene soporte bastante interesante para trabajar con él, al igual que vimos con las listas. Digamos, se hace bastante sencillo operar con diccionarios.

Declarando/construyendo un diccionario

Como con las listas, tenemos dos formas.

Utilizando literales:

edades = {  "Paula" : 28,
            "Antonio" : 52,
            "Guillermo" : 32,
            "Sariah" : 13,
            "Nicolas" : 14 
        }

No hace falta que estén en lineas separadas. Acá está así porque son varias claves, y resulta más fácil de leer, pero puede estar todo en la misma linea.

O bien podemos crear un nuevo vacío:

edades = dict()

Luego, se saben imprimir:

print 'Edades', edades
>> Edades {'Nicolas': 14, 'Guillermo': 32, 'Sariah': 13, 'Paula': 28, 'Antonio': 52}

Operaciones Simples (get, has_key, pop, update)

A continuación algunas operaciones simples para operar con el diccionario.

# CONTIENE ?
print 'contiene a Sariah?', edades.has_key('Sariah')

# OBTENER VALOR (SIN REMOVER)

print 'sariah =', edades.get('Sariah')
# REMOVER
edades.pop('Paula')
print 'Removiendo Paula', edades
# UPDATE
edades.update({ 'Antonio' : 53, 'Nicolas' : 15 })
print 'Luego de cumplir anios', edades

Sus nombres ya son bastante intuitivos.

Diferentes formas de Iterarlos

Tenemos diferentes formas para iterarlos, dependiendo de qué información queremos.

Por ejemplo podríamos querer de cada entrada su clave y valor:

for nombre, edad in edades.items():
    print nombre, 'tiene', edad, 'anios'

En este caso el método items() de los diccionarios genera una nueva lista con tuplas. Por temas de performance, si estamos trabajando con un diccionario muy muy grande, quizás no querramos generar una lista, para después recorrerla, dado que nunca vamos a utilizarla toda "completa", si no que vamos a ir operando de un elemento por vez. Para esto existe otro método iteritems() que a efectos prácticos nos va a parecer exáctamente lo mismo,

for nombre, edad in edades.iteritems():
    print nombre, 'tiene', edad, 'anios'

La diferencia es que retorna un Iterador y no una lista. Un Iterador es un objeto que sabe dar un elemento más cuando alguien se lo pide. Y también sabe decir si ya no tiene más. La ventaja es que entonces, no se genera una lista de antemano con todas las claves, sino que el iterador puede ir devolviendolas de a una, a medida que el for se las pide. Evitando el consumo de memoria.

Por otra parte, podría interesarnos solo la lista de las claves...

for nombre in edades.keys():
    print 'Clave', nombre

o bien solo los valores...

for edad in edades.values():
    print 'Valor', edad
   

Qué más puedo hacer con los diccionarios ?

Al menos una cosa más les podemos explicar nosotros, y está en la página de Conjuntos definidos por Comprensión