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 elmismo orden, tienes una lista de filas: parecido a una tabla o a unamatriz 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]
2usuarios = [
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
9primera = usuarios[0]
10print(primera[0]) # nombre: Ana
11print(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
1def 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
9email = buscar_email_por_nombre(usuarios, " luis ")
10print(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 (usatry/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
1calificaciones = []
2
3while 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
14for fila in calificaciones:
15 print(f"{fila[0]}: {fila[1]}")
16
17if 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 contry/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
1PRECIO_BOLETO = 50
2
3def 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
14def 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
22def 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
36def 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
44def 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
56def 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
76if __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.