Estructuras de datos
Hasta ahora has trabajado con variables individuales: un nombre, una edad, un precio. Pero piensa en el mundo real: tu lista de contactos no es UN contacto, es una colección de contactos. Tu playlist de Spotify no es UNA canción, es una lista de canciones. Y tu carrito de la compra no es UN producto, es un conjunto de productos. Para manejar colecciones de datos necesitas listas.
Listas: colecciones de cosas relacionadas
Una lista es exactamente lo que suena: un conjunto ordenado de elementos del mismo tipo. Como una lista de la compra, una cola de espera o los episodios de una serie. Cada elemento tiene una posición (empezando desde 1 en pseudocódigo) que te permite acceder a él directamente.
INICIO
// Crear una lista de canciones
canciones = ["Bohemian Rhapsody", "Hotel California", "Imagine", "Smells Like Teen Spirit"]
// La lista tiene 4 elementos
// Posición 1: "Bohemian Rhapsody"
// Posición 2: "Hotel California"
// Posición 3: "Imagine"
// Posición 4: "Smells Like Teen Spirit"
FIN
Piensa en una lista como una estantería numerada. Cada hueco tiene un número y dentro hay un elemento. Puedes decir "dame lo que hay en el hueco 3" y obtienes "Imagine".
Acceder a elementos por posición
Cada elemento de una lista ocupa una posición. Es como los asientos de un cine: fila 1, asiento 3. Puedes ir directamente a cualquier posición sin tener que recorrer toda la lista.
INICIO
playlist = ["Despacito", "Shape of You", "Blinding Lights", "Bad Guy", "Levitating"]
// Acceder por posición
MOSTRAR playlist[1] // "Despacito" (el primero)
MOSTRAR playlist[3] // "Blinding Lights" (el tercero)
MOSTRAR playlist[5] // "Levitating" (el último)
// Saber cuántos elementos tiene
totalCanciones = LONGITUD(playlist)
MOSTRAR "Tienes " + totalCanciones + " canciones" // "Tienes 5 canciones"
// Cambiar un elemento
playlist[2] = "Flowers"
// Ahora la lista es: ["Despacito", "Flowers", "Blinding Lights", "Bad Guy", "Levitating"]
FIN
Añadir y eliminar elementos
Las listas no son estáticas. Puedes añadir canciones a tu playlist, eliminar contactos de tu agenda o reorganizar tu lista de tareas:
INICIO
tareas = ["Comprar leche", "Estudiar lógica"]
// Añadir al final
AÑADIR tareas, "Llamar al dentista"
// tareas = ["Comprar leche", "Estudiar lógica", "Llamar al dentista"]
// Añadir en una posición específica
INSERTAR tareas, 2, "Pasear al perro"
// tareas = ["Comprar leche", "Pasear al perro", "Estudiar lógica", "Llamar al dentista"]
// Eliminar un elemento
ELIMINAR tareas, 1
// tareas = ["Pasear al perro", "Estudiar lógica", "Llamar al dentista"]
FIN
Buscar en una lista (búsqueda lineal)
Imagina que buscas una canción en tu playlist. No hay un atajo mágico: tienes que ir canción por canción hasta encontrarla (o llegar al final sin encontrarla). Esto se llama búsqueda lineal y es exactamente lo que haces cuando buscas tu nombre en una lista de asistentes que NO está ordenada.
FUNCION buscarCancion(playlist, nombreBuscado)
PARA CADA cancion EN playlist HACER
SI cancion == nombreBuscado ENTONCES
DEVOLVER VERDADERO
FIN SI
FIN PARA CADA
// Si llegamos aquí, no la encontramos
DEVOLVER FALSO
FIN FUNCION
// Uso
playlist = ["Imagine", "Yesterday", "Bohemian Rhapsody", "Hotel California"]
encontrada = buscarCancion(playlist, "Yesterday")
MOSTRAR encontrada // VERDADERO
encontrada = buscarCancion(playlist, "Despacito")
MOSTRAR encontrada // FALSO
Es como buscar un libro en una estantería desordenada: no te queda otra que mirar uno por uno. Si la estantería tiene 1000 libros, en el peor caso tendrás que mirar los 1000.
Ordenar una lista
Ordenar es poner los elementos en un orden lógico: alfabético, de menor a mayor, por fecha, por puntuación. Piensa en cómo ordenas un mazo de cartas: coges una carta, la comparas con las demás y la pones en su sitio.
INICIO
// Ordenar nombres alfabéticamente
contactos = ["Zara", "Ana", "Miguel", "Carlos", "Elena"]
ORDENAR contactos ASCENDENTE
// Resultado: ["Ana", "Carlos", "Elena", "Miguel", "Zara"]
// Ordenar números de mayor a menor
puntuaciones = [85, 92, 67, 100, 78]
ORDENAR puntuaciones DESCENDENTE
// Resultado: [100, 92, 85, 78, 67]
// Puedes saber el máximo y el mínimo fácilmente
mejor = puntuaciones[1] // 100 (el primero tras ordenar descendente)
peor = puntuaciones[5] // 67 (el último)
FIN
Filtrar una lista
Filtrar es quedarte solo con los elementos que cumplen una condición. Como cuando en Spotify filtras tu playlist por género, o en Netflix filtras películas por puntuación.
FUNCION filtrarPorGenero(canciones, generos, generoBuscado)
resultado = []
PARA i = 1 HASTA LONGITUD(canciones) HACER
SI generos[i] == generoBuscado ENTONCES
AÑADIR resultado, canciones[i]
FIN SI
FIN PARA
DEVOLVER resultado
FIN FUNCION
// Datos de ejemplo
canciones = ["Bohemian Rhapsody", "Blinding Lights", "Smells Like Teen Spirit", "Starboy"]
generos = ["Rock", "Pop", "Rock", "Pop"]
cancionesRock = filtrarPorGenero(canciones, generos, "Rock")
MOSTRAR cancionesRock // ["Bohemian Rhapsody", "Smells Like Teen Spirit"]
cancionesPop = filtrarPorGenero(canciones, generos, "Pop")
MOSTRAR cancionesPop // ["Blinding Lights", "Starboy"]
Ejemplo completo: playlist de Spotify
Vamos a combinar todo en un ejemplo real. Imagina que gestionas una playlist con estas operaciones: añadir canciones, buscar una canción, filtrar por género y ordenar por valoración.
INICIO
// Nuestra playlist con nombres, géneros y valoraciones (1-5)
nombres = ["Bohemian Rhapsody", "Blinding Lights", "Imagine", "Bad Guy"]
generos = ["Rock", "Pop", "Rock", "Pop"]
valoraciones = [5, 4, 5, 3]
// 1. Añadir una canción nueva
AÑADIR nombres, "Stairway to Heaven"
AÑADIR generos, "Rock"
AÑADIR valoraciones, 5
// 2. Buscar si tenemos "Imagine"
encontrada = FALSO
PARA CADA nombre EN nombres HACER
SI nombre == "Imagine" ENTONCES
encontrada = VERDADERO
FIN SI
FIN PARA CADA
MOSTRAR "¿Tenemos Imagine? " + encontrada // VERDADERO
// 3. Filtrar solo las de Rock
cancionesRock = []
PARA i = 1 HASTA LONGITUD(nombres) HACER
SI generos[i] == "Rock" ENTONCES
AÑADIR cancionesRock, nombres[i]
FIN SI
FIN PARA
MOSTRAR "Rock: " + cancionesRock
// Rock: ["Bohemian Rhapsody", "Imagine", "Stairway to Heaven"]
// 4. Encontrar la canción mejor valorada
mejorNota = 0
mejorCancion = ""
PARA i = 1 HASTA LONGITUD(nombres) HACER
SI valoraciones[i] > mejorNota ENTONCES
mejorNota = valoraciones[i]
mejorCancion = nombres[i]
FIN SI
FIN PARA
MOSTRAR "Mejor canción: " + mejorCancion + " (" + mejorNota + "/5)"
FIN
Ejemplo: lista de contactos
Otro caso muy cotidiano. Tu agenda del móvil es básicamente una lista con operaciones de búsqueda, ordenación y filtrado:
INICIO
nombres = ["Zara López", "Ana García", "Miguel Torres", "Carlos Ruiz"]
ciudades = ["Madrid", "Barcelona", "Madrid", "Valencia"]
telefonos = ["611111111", "622222222", "633333333", "644444444"]
// Buscar un contacto por nombre
buscar = "Miguel Torres"
PARA i = 1 HASTA LONGITUD(nombres) HACER
SI nombres[i] == buscar ENTONCES
MOSTRAR "Encontrado: " + nombres[i]
MOSTRAR "Ciudad: " + ciudades[i]
MOSTRAR "Teléfono: " + telefonos[i]
FIN SI
FIN PARA
// Filtrar contactos de Madrid
contactosMadrid = []
PARA i = 1 HASTA LONGITUD(nombres) HACER
SI ciudades[i] == "Madrid" ENTONCES
AÑADIR contactosMadrid, nombres[i]
FIN SI
FIN PARA
MOSTRAR "Contactos en Madrid: " + contactosMadrid
// ["Zara López", "Miguel Torres"]
// Ordenar alfabéticamente
ORDENAR nombres ASCENDENTE
// ["Ana García", "Carlos Ruiz", "Miguel Torres", "Zara López"]
FIN
Resumen
- Una lista es una colección ordenada de elementos del mismo tipo. Cada elemento tiene una posición numérica.
- Puedes acceder a cualquier elemento por su posición, añadir nuevos elementos y eliminar los que ya no necesitas.
- La búsqueda lineal recorre la lista elemento por elemento hasta encontrar lo que buscas (o llegar al final).
- Ordenar es poner los elementos en un orden lógico: alfabético, numérico, por fecha, etc.
- Filtrar es quedarte solo con los elementos que cumplen una condición.
- Las listas son la base de casi todo lo que usas a diario: playlists, contactos, carritos de compra, feeds de redes sociales.
En la siguiente lección aprenderemos sobre pseudocódigo y diagramas de flujo: cómo escribir soluciones sin sintaxis y representarlas visualmente antes de tocar un lenguaje de programación.
Gestiona tu lista de películas pendientes
Con papel y bolígrafo (o en un editor de texto), escribe el pseudocódigo para gestionar una lista de películas pendientes de ver. Empieza con esta lista:
- Películas: "Interstellar", "Parásitos", "El Padrino", "Coco", "Dune", "Oppenheimer"
- Géneros: "Sci-Fi", "Thriller", "Drama", "Animación", "Sci-Fi", "Drama"
- Valoraciones: 9, 8.5, 9.2, 8.4, 8, 8.7
Tu pseudocódigo debe:
- Añadir la película "Everything Everywhere All at Once" (Sci-Fi, valoración 8.8).
- Eliminar "El Padrino" de la lista (ya la viste).
- Buscar si "Coco" está en la lista.
- Filtrar solo las películas de Sci-Fi.
- Ordenar todas las películas de mayor a menor valoración y mostrar cuál es la mejor.
lightbulb Pistas
Para eliminar, busca primero la posición del elemento. Para filtrar, recorre la lista y añade a una nueva lista solo los que cumplan la condición del género. Para ordenar por valoración y encontrar la mejor, puedes recorrer la lista buscando el valor máximo con una variable mejorNota.