IWI131 Programación


Estructuras de Datos: Diccionarios



Departamento de Informática
Universidad Técnica Federico Santa María

Diccionarios

Un diccionario es una colección no ordenada que permite asociar llaves con valores. Utilizando la llave siempre es posible recuperar, de manera eficiente, el valor asociado.

  • El funcionamiento de diccionarios es similar a cuando se recupera un elemento de una lista usando su índice: L[i]
  • En este caso el índice de la lista es una ''llave'' y el elemento recuperado es el ''valor''
In [1]:
L = [1, 3, 4, 2, 4]
#imprimiendo el elemento del indice 3 de la lista L
print(L[3])
2
  • En diccionarios, las llaves pueden ser: números, strings o tuplas.
  • Las llaves en un diccionario deben ser únicas.
In [2]:
#diccionario de telefonos
#llaves: nombres de personas (string)
#valores: numeros de telefono asociados a cada nombre (int)
telefonos = {'Jaimito':5551428, 'Yayita': 5550012, 'Pepito':5552437}

#mostrar por pantalla el telefono de Pepito
print(telefonos['Pepito'])
5552437

Creación de Diccionarios

Un diccionario vacío puede ser creado por medio de la función dict() y con el paréntesis de llave {}.

In [3]:
dicc1 = {}
dicc2 = dict()
print(dicc1)
print(dicc2)
{}
{}

Un diccionario con elementos, considera que cada uno de ellos tiene una llave y su valor respectivo.

  • El diccionario está delimitado por paréntesis de llaves.
  • Cada elemento se separa por comas.
  • Se utilizan los dos puntos : para separar una llave de un valor en un elemento.

Considerar el siguiente diccionario que relaciona animales (llaves) con la cantidad de patas que tienen (valores).

In [4]:
patas = {'humano': 2, 'pulpo': 8, 'perro': 4, 'gato': 4}

Manipulación de Diccionarios

Agregar/Modificar un elemento

Se debe hacer una asignación del diccionario con una llave igual a un valor.

  • Si la llave utilizada no existe en el diccionario, se agrega un nuevo elemento.
  • Si la llave utilizada existe en el diccionario, el valor asociado es modificado.
In [5]:
patas = {'humano': 2, 'pulpo': 8, 'perro': 5, 'gato': 4}
print("Diccionario antes de agregar un valor")
print(patas)
patas['cienpies'] = 100
print("Diccionario despues de agregar un valor")
print(patas)
Diccionario antes de agregar un valor
{'humano': 2, 'pulpo': 8, 'perro': 5, 'gato': 4}
Diccionario despues de agregar un valor
{'humano': 2, 'pulpo': 8, 'perro': 5, 'gato': 4, 'cienpies': 100}
In [6]:
#los perros en realidad tienen cuatro patas, cambiar valor en el diccionario
patas["perro"] = 4
print("Diccionario despues de cambiar un valor")
print(patas)
Diccionario despues de cambiar un valor
{'humano': 2, 'pulpo': 8, 'perro': 4, 'gato': 4, 'cienpies': 100}

Eliminar un elemento

Usando la instrucción del se puede eliminar un elemento del diccionario. Se debe indicar la llave del elemento que se quiere eliminar.

In [7]:
patas =  {'cienpies': 100, 'humano': 2, 'gato': 4, 'pulpo': 8, 'perro': 4}
print("Diccionario antes de eliminar un elemento")
print(patas)
#eliminando el elemento del diccionario
del patas["pulpo"]
print("Diccionario despues de eliminar un elemento")
print(patas)
Diccionario antes de eliminar un elemento
{'cienpies': 100, 'humano': 2, 'gato': 4, 'pulpo': 8, 'perro': 4}
Diccionario despues de eliminar un elemento
{'cienpies': 100, 'humano': 2, 'gato': 4, 'perro': 4}

Al igual que en listas, al intentar eliminar un elemento que no existe (porque no existe la llave en el diccionario) ocurre un error.

In [8]:
patas =  {'cienpies': 100, 'humano': 2, 'gato': 4, 'pulpo': 8, 'perro': 4}
#intentando eliminar un elemento en el diccionario
del patas["oso"]
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-6a45d2ad4cf3> in <module>
      1 patas =  {'cienpies': 100, 'humano': 2, 'gato': 4, 'pulpo': 8, 'perro': 4}
      2 #intentando eliminar un elemento en el diccionario
----> 3 del patas["oso"]

KeyError: 'oso'

Acceder a elementos de un diccionario

El valor asociado a la llave k del diccionario d se puede obtener como d[k]:

In [9]:
patas =  {'cienpies': 100, 'humano': 2, 'gato': 4, 'pulpo': 8, 'perro': 4}
#accediendo y mostrando por pantalla la cantidad de patas de un gato
print("El gato tiene",patas['gato'],"patas")
El gato tiene 4 patas
In [10]:
#intentando mostrar las patas que tiene un oso
print("El oso tiene",patas['oso'],"patas")
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-10-85f4e9682445> in <module>
      1 #intentando mostrar las patas que tiene un oso
----> 2 print("El oso tiene",patas['oso'],"patas")

KeyError: 'oso'

Funciones sobre Diccionarios

Cantidad de elementos

La función len permite saber la cantidad de elementos del diccionario.

In [11]:
patas =  {'cienpies': 100, 'humano': 2, 'gato': 4, 'pulpo': 8, 'perro': 4}
print(len(patas))
5

Comprobar si una llave está en el diccionario

La instrucción in verifica si una llave está en el diccionario.

In [12]:
patas =  {'cienpies': 100, 'humano': 2, 'gato': 4, 'pulpo': 8, 'perro': 4}
print('pulpo' in patas)
print(8 in patas)
True
False

Iteración sobre diccionarios

Se pueden utilizar ciclos for para iterar sobre diccionarios.

Considere el diccionario capitales, donde las llaves corresponden a países y los valores son las capitales respectivas de cada país.

In [13]:
capitales = {'Chile': 'Santiago', 'Peru': 'Lima', 'Ecuador': 'Quito'}
for pa in capitales:
    #que esta imprimiendo en cada iteracion del ciclo?
    print("pa =",pa)
pa = Chile
pa = Peru
pa = Ecuador
In [14]:
capitales = {'Chile': 'Santiago', 'Peru': 'Lima', 'Ecuador': 'Quito'}
for pais in capitales:
    #que se esta imprimiendo en cada iteracion del ciclo?
    print("La capital de",pais,"es",capitales[pais])
La capital de Chile es Santiago
La capital de Peru es Lima
La capital de Ecuador es Quito

Sintaxis genérica:

for var in diccio:
    a = funcion(var)
  • La variable var está accediento implícitamente a cada llave del diccionario diccio.
  • Recordar que, teniendo la llave, es posible acceder al valor asociado mediante diccio[var].

Iterables (hasta el momento):

  • Strings
  • Listas
  • range
  • Tuplas
  • Diccionarios

Ejercicios

1. Escriba la función contar_letras(palabra) que reciba un string y retorne un diccionario que indique cuántas veces aparece cada letra en dicho string.

>>> contar_letras('entretener')
{'e': 4, 'n': 2, 'r': 2, 't': 2}
>>> contar_letras('lapiz')
{'a': 1, 'i': 1, 'l': 1, 'p': 1, 'z': 1}
In [15]:
def contar_letras(palabra):
    d = dict()
    for letra in palabra:
        if letra not in d:
            d[letra] = 0
        d[letra] += 1
    return d

diccio = contar_letras("entretener")
print(diccio)
{'e': 4, 'n': 2, 't': 2, 'r': 2}

2. Considere la siguente lista de strings palabras.

lista_palabras = ["el", "jardin", "la", "casa", "mi", "el", "la", ...]

Con el objetivo de construir una nube de palabras, se requiere de una función contar_palabras(lista) que, dada una lista de palabras lista, retorne una lista de pares ordenados, donde la primera componente sea una palabra y la segunda la cantidad de veces que paraece dicha palabra en la lista.

>>> contar_palabras(lista)
[('mi', 1), ('casa', 1), ('jardin', 1), ('el', 2), ('la', 2), ...]
In [16]:
def contar_palabras(lista):
    d = {}
    for p in lista:
        if p not in d:
            d[p] = 0
        d[p]+=1
    lista = list()
    for pa in d:
        lista.append((pa,d[pa]))
    return lista

lista_palabras = ["el", "jardin", "la", "casa", "mi", "el", "la"]

print(contar_palabras(lista_palabras))
[('el', 2), ('jardin', 1), ('la', 2), ('casa', 1), ('mi', 1)]

3. Considere la lista de tuplas viajes, donde cada tupla agrupa el nombre de una persona y una ciudad donde esa persona ha viajado:

viajes = [("Juan", "Santiago"), ("Pedro", "Coquimbo"), ("Juan", "Valparaiso"), ("Diego", "Talcahuano"), ...]

Escriba la función ciudades_visitadas(viajes) que reciba una lista como la mostrada en viajes. Esta función debe retornar un diccionario, cuyas llave corresponde al nombre de una persona y el valor es una lista con todas las ciudades que ha visitado esa persona.

>>> ciudades_visitadas(viajes)
{'Diego': ['Talcahuano'], 'Pedro': ['Coquimbo'], 'Juan': ['Santiago', 'Valparaiso'], ...}
In [17]:
def ciudades_visitadas(viajes):
    d = dict()
    for tupla in viajes:
        persona, ciudad = tupla
        if persona not in d:
            d[persona] = list()
        d[persona].append(ciudad)
    return d

v = [("Juan", "Santiago"), ("Pedro", "Coquimbo"), ("Juan", "Valparaiso"), ("Diego", "Talcahuano")]
print(ciudades_visitadas(v))
{'Juan': ['Santiago', 'Valparaiso'], 'Pedro': ['Coquimbo'], 'Diego': ['Talcahuano']}
In [ ]: