Tiza Las materias del CBC
Practicar →

Pensamiento Computacional (090) · Unidad 4 — Estructuras de datos

Diccionarios

Un diccionario guarda pares clave-valor. En vez de buscar por posición, buscás por nombre — y eso cambia todo.

Practicar este tema →7 ejercicios que te corrigen paso a paso · gratis, sin cuenta

La explicación

Buscar por nombre, no por número

notas = {"ana": 9, "luis": 4, "sol": 7}

notas["ana"]   → 9
len(notas)     → 3

Van con llaves, y cada elemento es clave: valor. La clave hace de índice, y en vez de ser un número puede ser un texto que significa algo.

Con una lista tendrías que guardar los nombres en una lista y las notas en otra, y mantener las posiciones sincronizadas. Con un diccionario la relación está adentro de la estructura, y buscar el alumno "ana" no requiere recorrer nada.

Agregar, cambiar, borrar

notas["pedro"] = 8   # si no existe, la crea
notas["ana"] = 10    # si existe, la pisa
del notas["luis"]    # la borra

Las claves son únicas: no puede haber dos "ana". Asignar sobre una clave existente reemplaza el valor.

La clave que no está

notas["pepe"]           → KeyError, el programa se corta
notas.get("pepe")      → None, sin error
notas.get("pepe", 0)   → 0, el valor por defecto
"pepe" in notas        → False
Esta es la causa número uno de programas que se cortan con diccionarios. Si no estás seguro de que la clave exista, usá get o preguntá con in antes. get con valor por defecto es especialmente cómodo para contar cosas.

Recorrer

for clave in notas:                # las claves
    print(clave, notas[clave])

for clave, valor in notas.items():  # las dos cosas
    print(clave, valor)

Ojo: for x in notas recorre las claves, no los valores. Es de lo que más confunde al principio. Si querés los valores sueltos, notas.values().

Contar cosas: el uso estrella

texto = "casa"
cuenta = {}
for letra in texto:
    cuenta[letra] = cuenta.get(letra, 0) + 1
print(cuenta)   # {'c': 1, 'a': 2, 's': 1}

La línea del medio es el idioma que conviene memorizar: "lo que había, o 0 si no había, más uno". Sin get habría que preguntar con un if cada vez.

Ejemplo resuelto

Escribir una función que reciba una lista de palabras y devuelva un diccionario con cuántas veces aparece cada una.

El patrón de conteo, que sirve para esto y para mil cosas más:

def contar(palabras):
    cuenta = {}
    for p in palabras:
        cuenta[p] = cuenta.get(p, 0) + 1
    return cuenta

Con ["sol", "mar", "sol"]:

"sol" → no estaba: get devuelve 0, queda en 1
"mar" → no estaba: queda en 1
"sol" → ya estaba en 1: queda en 2

resultado: {"sol": 2, "mar": 1}

Por qué get(p, 0) y no cuenta[p]. La primera vez que aparece una palabra, la clave todavía no existe. Con corchetes eso sería un KeyError y el programa se cortaría en la primera palabra.

La versión sin get necesita un if y tres líneas donde había una:
if p in cuenta:
    cuenta[p] = cuenta[p] + 1
else:
    cuenta[p] = 1
Hace exactamente lo mismo. Vale conocer las dos, pero la de get es la que vas a ver escrita en todos lados.

Control: la suma de todos los valores del diccionario tiene que dar la cantidad de elementos de la lista original. Acá 2 + 1 = 3 ✓

Dónde se cae la mayoría

Hasta acá la explicación. La práctica es la otra mitad: 7 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Además trae una animación que muestra la idea en movimiento.

Practicar Diccionarios →

Ver todos los temas de Pensamiento Computacional