Describir registros con diccionarios

Ciencia y tecnologíaDescribir registros con diccionarios

Una tarea no siempre puede describirse con un único texto. Puede tener un título y un estado que indique si está terminada. Los diccionarios permiten agrupar esos campos mediante claves con significado. En esta lección construirás registros sencillos y combinarás una lista con varios diccionarios sin perder de vista qué estructura representa cada cosa.

De un texto a un registro

Un diccionario relaciona claves con valores. Las llaves delimitan la estructura y los dos puntos separan cada clave de su valor. Utilizaremos claves de texto para que el significado resulte fácil de leer. Este ejemplo representa una tarea pendiente:

tarea = {"titulo": "Preparar material", "hecha": False}
print(tarea["titulo"])
print(tarea["hecha"])

El título es una cadena y hecha es un booleano. La clave «titulo» identifica un campo, no la posición de un elemento. No dependes de recordar que el primer dato era el título y el segundo el estado. El propio nombre de la clave explica qué representa cada valor.

Las claves de un diccionario son únicas. Si defines dos veces la misma clave en un literal la última asignación sustituye el valor anterior. Por eso un diccionario no es una lista de pares donde puedas conservar indefinidamente campos repetidos con la misma clave. Para guardar varias tareas necesitas una colección de registros.

Leer y modificar campos

Para cambiar el estado asigna un nuevo valor a la clave correspondiente. No necesitas construir otra tarea entera. Después puedes utilizar una condición para decidir cómo mostrarla. El registro conserva los datos y la presentación decide qué palabras verá el usuario.

tarea = {"titulo": "Preparar material", "hecha": False}
tarea["hecha"] = True
if tarea["hecha"]:
    print("Terminada:", tarea["titulo"])
else:
    print("Pendiente:", tarea["titulo"])

No guardes «False» entre comillas para representar un booleano falso. Eso sería una cadena no vacía y una condición la consideraría verdadera. Utiliza False o True sin comillas. La apariencia de un dato al imprimirlo no sustituye la comprobación de su tipo.

También puedes añadir una nueva clave mediante asignación. Sin embargo, introducir campos diferentes sin una regla clara complica después los recorridos. En nuestro modelo todas las tareas tendrán titulo y hecha. Mantendremos esa estructura constante para que las funciones sepan qué pueden esperar.

Campos obligatorios y campos opcionales

Si consultas tarea[«fecha»] y esa clave no existe recibirás un KeyError. Cuando un campo es obligatorio este fallo puede revelar que el registro está mal construido. No conviene ocultarlo automáticamente inventando un valor que haga parecer correcto un dato incompleto.

Para un campo realmente opcional puedes utilizar get con un valor predeterminado. Por ejemplo, tarea.get(«nota», «Sin nota») devuelve el contenido de nota cuando existe y el texto alternativo cuando no. La decisión importante es si la ausencia está permitida por tu diseño.

Un valor predeterminado no valida el contenido existente. Si nota existe y contiene un número get devolverá ese número. La validación de estructuras necesita comprobar presencia y tipos cuando los datos proceden de una fuente que puede contener errores. Volveremos a ese asunto al leer archivos JSON.

Una lista de tareas

La lista representa la colección completa y cada diccionario representa una tarea. Puedes combinar ambas estructuras sin añadir herramientas nuevas. Observa cómo el recorrido obtiene cada registro y después consulta sus campos.

tareas = [
    {"titulo": "Ordenar la mesa", "hecha": False},
    {"titulo": "Revisar apuntes", "hecha": True}
]
for numero, tarea in enumerate(tareas, start=1):
    estado = "pendiente"
    if tarea["hecha"]:
        estado = "terminada"
    print(f"{numero}. {tarea['titulo']} ({estado})")

La cadena formateada usa comillas dobles por fuera y simples en la clave interior para facilitar la lectura. El programa muestra una numeración visible y un estado comprensible. Los datos siguen conteniendo booleanos, no las palabras de la presentación. Esa separación permite cambiar el mensaje sin transformar todos los registros.

Para completar la primera tarea puedes escribir tareas[0][«hecha»] = True. Primero seleccionas el diccionario situado en el índice cero y después actualizas su campo hecha. Lee la expresión por pasos en lugar de verla como una combinación misteriosa de corchetes.

Crear un registro nuevo para cada elemento

Un error frecuente consiste en reutilizar el mismo diccionario para varias tareas. Si lo añades a la lista y después cambias su título, todas las referencias a ese mismo objeto reflejarán el cambio. Debes crear un diccionario nuevo cada vez que das de alta una tarea.

tareas = []
tareas.append({"titulo": "Leer", "hecha": False})
tareas.append({"titulo": "Practicar", "hecha": False})
tareas[0]["hecha"] = True
print(tareas[1]["hecha"])

La salida final debe ser False. Completar la primera no completa la segunda porque son dos registros distintos. Esta comprobación será útil en las pruebas del gestor. No basta con contar dos elementos: debes verificar que pueden cambiar de manera independiente.

Mantener un modelo pequeño

Podrías añadir fechas, prioridades, etiquetas y recordatorios. Cada campo nuevo exige decidir su tipo, su entrada, su validación y su presentación. Para aprender resulta más útil un modelo pequeño completamente operativo. El gestor del curso conservará únicamente título y estado hasta que termine la primera versión.

Errores habituales

  • Escribir una clave de forma distinta al crearla y al consultarla.
  • Guardar booleanos como cadenas entre comillas.
  • Reutilizar un mismo diccionario para tareas que deberían ser independientes.
  • Utilizar get para disimular que falta un campo obligatorio.

Lo que deberías recordar

  • Las claves identifican campos con significado.
  • Una lista puede contener varios registros del mismo modelo.
  • Los datos y las palabras utilizadas para mostrarlos cumplen funciones distintas.
  • Cada tarea nueva necesita su propio diccionario.

Ejercicio práctico

Completa la décima hoja con dos tareas inventadas. Define sus campos y tipos antes de escribir el código. Añade ambos registros a una lista, muestra sus títulos y marca como terminada únicamente la primera. Comprueba que la segunda sigue pendiente.

Después intenta consultar en una copia un campo que no existe y anota el tipo de error. Decide si ese campo sería obligatorio u opcional en tu aplicación. Justifica la elección. La práctica termina cuando puedes explicar qué representan la lista exterior, cada diccionario y los dos campos internos sin depender de memorizar el ejemplo.

Siguiente capítulo: Crear funciones para reutilizar soluciones.

Volver al índice del curso de programación desde cero.

Últimos posts

Artículos más vistos

Horóscopo diario
Menú diario