Café y Código

12. Listas como registros (matriz de datos) y proyecto cine 🎬

De la lista simple a la “tabla”

Ya viste listas de números o de textos. Cuando cada elemento es a su vez una lista con varios campos en el mismo orden, tienes una lista de filas: parecido a una tabla o a una matriz donde cada fila es un registro (por ejemplo, un usuario).

Convención clara: defines qué significa cada índice (0 = nombre, 1 = email, 2 = edad) y lo respetas en todas las filas.

registros.py
PYTHON
1 # Cada fila: [nombre, email, edad]
2 usuarios = [
3 ["Ana", "ana@mail.com", 28],
4 ["Luis", "luis@mail.com", 34],
5 ["Marta", "marta@mail.com", 22],
6 ]
7
8 # Leer un campo de la primera fila
9 primera = usuarios[0]
10 print(primera[0]) # nombre: Ana
11 print(primera[2]) # edad: 28

Buscar y extraer información

Para localizar un registro (por nombre) recorres la lista con un bucle, comparas el campo que te interesa y, si coincide, lees el resto de columnas.

buscar.py
PYTHON
1 def buscar_email_por_nombre(tabla, nombre_buscado):
2 nombre_buscado = nombre_buscado.strip().lower()
3 for fila in tabla:
4 nombre, email, edad = fila[0], fila[1], fila[2]
5 if nombre.lower() == nombre_buscado:
6 return email
7 return None
8
9 email = buscar_email_por_nombre(usuarios, " luis ")
10 print(email) # luis@mail.com

🐍 Ejercicio: persona y nota

Crea una lista vacía calificaciones. En un bucle, pide el nombre de una persona y su nota (usa try/except para asegurarte de que la nota sea un número). Guarda cada registro como [nombre, nota] con append. Termina cuando el nombre esté vacío. Al final, imprime todos los registros y la nota media del grupo.

👁️ Ver solución sugerida
notas.py
PYTHON
1 calificaciones = []
2
3 while True:
4 nombre = input("Nombre (vacío para terminar): ").strip()
5 if nombre == "":
6 break
7 try:
8 nota = float(input("Nota: "))
9 except ValueError:
10 print("La nota debe ser un número. Intenta de nuevo.")
11 continue
12 calificaciones.append([nombre, nota])
13
14 for fila in calificaciones:
15 print(f"{fila[0]}: {fila[1]}")
16
17 if calificaciones:
18 media = sum(fila[1] for fila in calificaciones) / len(calificaciones)
19 print("Nota media:", round(media, 2))

Proyecto integrador: entradas al cine

Este programa junta menú con while, listas como registros, condicionales, funciones y validación con try/except. Cada venta se guarda como una fila: [nombre_cliente, película, boletos, total_pagado].

Precio fijo por boleto (ejemplo): 50 (ajusta el número a tu moneda). El menú ofrece registrar una venta, listar ventas, buscar por nombre de cliente y salir.

cine.py
PYTHON
1 PRECIO_BOLETO = 50
2
3 def pedir_entero_positivo(mensaje):
4 while True:
5 try:
6 n = int(input(mensaje))
7 if n < 1:
8 print("Debe ser al menos 1.")
9 continue
10 return n
11 except ValueError:
12 print("Escribe un número entero válido.")
13
14 def mostrar_menu():
15 print("\n--- Cine Python ---")
16 print("1. Registrar entrada")
17 print("2. Listar todas las ventas")
18 print("3. Buscar ventas por nombre de cliente")
19 print("4. Total recaudado")
20 print("0. Salir")
21
22 def registrar_venta(ventas):
23 nombre = input("Nombre del cliente: ").strip()
24 if not nombre:
25 print("El nombre no puede estar vacío.")
26 return
27 pelicula = input("Película: ").strip()
28 if not pelicula:
29 print("Indica una película.")
30 return
31 boletos = pedir_entero_positivo("Número de boletos: ")
32 total = boletos * PRECIO_BOLETO
33 ventas.append([nombre, pelicula, boletos, total])
34 print(f"Registrado: {boletos} boleto(s) para '{pelicula}' — total {total}")
35
36 def listar_ventas(ventas):
37 if not ventas:
38 print("No hay ventas todavía.")
39 return
40 for i, fila in enumerate(ventas, start=1):
41 nombre, peli, boletos, total = fila
42 print(f"{i}. {nombre} | {peli} | {boletos} boletos | {total}")
43
44 def buscar_por_cliente(ventas):
45 clave = input("Nombre (o parte) a buscar: ").strip().lower()
46 if not clave:
47 print("Escribe algo para buscar.")
48 return
49 hallados = [f for f in ventas if clave in f[0].lower()]
50 if not hallados:
51 print("No hay coincidencias.")
52 return
53 for fila in hallados:
54 print(f" → {fila[0]} | {fila[1]} | {fila[2]} boletos | {fila[3]}")
55
56 def main():
57 ventas = []
58 while True:
59 mostrar_menu()
60 op = input("Opción: ").strip()
61 if op == "1":
62 registrar_venta(ventas)
63 elif op == "2":
64 listar_ventas(ventas)
65 elif op == "3":
66 buscar_por_cliente(ventas)
67 elif op == "4":
68 recaudado = sum(fila[3] for fila in ventas)
69 print(f"Total recaudado: {recaudado}")
70 elif op == "0":
71 print("¡Hasta la próxima!")
72 break
73 else:
74 print("Opción no válida.")
75
76 if __name__ == "__main__":
77 main()

Puedes extenderlo con límites de aforo, descuentos con if, o guardar las ventas en un fichero cuando veas manejo de archivos; la base ya repasa la materia vista hasta aquí.

Dato curioso: Primera versión pública en 1991; Guido van Rossum. Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.