Ejercicios: Estructuras de Almacenamiento
Domina el arte de organizar las cajas.
Ejercicio 5.1: El Inventario Perdido (Listas)
Escenario: Gestionas un inventario de frutas.
- Crea una lista:
frutas = ["Manzana", "Pera", "Naranja"]. - Agrega “Uva” al final de la lista.
- Cambia “Pera” por “Mango” (está en la posición 1).
- Imprime la lista final.
Pista 1: hay un método de lista pensado exactamente para “agregar al final”, y otra forma de acceso directo para “reemplazar en una posición conocida”.
Pista 2:
.append(valor)agrega al final; asignar por índice (lista[i] = nuevo) reemplaza el elemento que ya está en esa posición.
Ejercicio 5.2: Catálogo de Precios (Diccionarios)
Escenario: Necesitas saber cuánto cuestan los productos.
- Crea un diccionario:
precios = {"Manzana": 10, "Mango": 15, "Uva": 20}. - El precio del Mango subió. Actualízalo a 18.
- Agrega un producto nuevo: “Sandía” con precio 30.
- Imprime el precio de la “Uva”.
Pista 1: en un diccionario, actualizar una clave que ya existe y agregar una clave nueva usan exactamente la misma sintaxis.
Pista 2: asignar a una clave (
precios[clave] = valor) sirve tanto para crear como para actualizar; Python decide solo según si la clave ya estaba ahí.
Ejercicio 5.3: Limpieza de Datos (Conjuntos)
Escenario: Te pasaron una lista de IDs de usuarios con duplicados.
ids = [101, 102, 101, 103, 102, 104]
- Convierte esa lista en un conjunto para eliminar los repetidos.
- Imprime cuántos usuarios únicos tienes usando
len(), el conteo rápido que conociste en la sección de Listas.
Pista 1: existe una función que envuelve cualquier lista y automáticamente descarta los valores repetidos.
Pista 2: convertir la lista a
setelimina los duplicados de un golpe; contar ese conjunto te dice cuántos elementos únicos quedaron.
Ejercicio 5.4: Datos Intocables (Tuplas)
Escenario: Estás definiendo los colores base de tu app.
- Crea una tupla:
colores_primarios = ("Rojo", "Azul", "Amarillo"). - Intenta cambiar “Rojo” por “Verde” y observa el error que ocurre. Copia el mensaje de error como un comentario en tu código (la sintaxis de comentarios con
#que ya usaste en el Cap. 3).
Pista 1: prueba la misma sintaxis de reemplazo por índice que usarías en una lista,
colores_primarios[0] = "Verde", y observa qué pasa.Pista 2: Python lanza un
TypeErrorcuyo mensaje incluye la frase “does not support item assignment”; ese es justo el texto que debes copiar como comentario.
Ejercicio 5.5: El Sistema Integrado (Reto Final)
Combina todo lo aprendido. Crea un script que tenga:
- Una lista de diccionarios, donde cada diccionario representa un estudiante.
estudiantes = [ {"nombre": "Ana", "calificacion": 90}, {"nombre": "Beto", "calificacion": 85} ] - Agrega un nuevo estudiante a la lista (tú mismo).
- Imprime el nombre del primer estudiante de la lista.
Pista 1: una lista de diccionarios sigue siendo una lista; agregar un estudiante nuevo usa el mismo método que agregarías a cualquier lista, solo que el elemento es un diccionario completo.
Pista 2: para agregarte, usa
.append()con un diccionario nuevo de la misma forma que los demás (imprimelen(estudiantes)antes y después para confirmar que se sumó); para el nombre del primero, encadena primero el índice de la lista y luego la clave del diccionario (lista[i]["clave"]).
Ejercicio 5.6: El Diccionario Seguro (.get e .items)
Tienes producto = {"nombre": "Tornillos", "precio": 5.5}.
- Imprime el valor de la clave
"descuento"con.get(), usando"sin descuento"como respaldo (esa clave no existe). - Recorre el diccionario con
.items()e imprime cada pareja comoclave: valor. (Recorrer es tema del Capítulo 8: aquí solo copia el bloque de la sección “Recorrer el Banco” y ajústalo.) - Comprueba con
insi existe la clave"stock".
Pista 1: hay un método de diccionario que te deja pedir una clave que quizá no exista sin que explote un
KeyError, y sin necesitar unifantes.Pista 2:
.get()acepta un segundo argumento que se usa como valor por defecto cuando la clave no existe; para recorrer pares,.items()te entrega la clave y el valor en cada vuelta.
Ejercicio 5.7: Rebanando el Estante (Slicing de listas)
Tienes estante = ["Martillo", "Taladro", "Sierra", "Clavos", "Cinta"]. Imprime:
- Las dos primeras herramientas.
- La última, sin contar cuántas hay.
- Las dos últimas.
- Todas menos la primera.
Pista 1: el slicing usa dos puntos dentro de los corchetes (
lista[inicio:fin]); omitir un lado significa “desde el principio” o “hasta el final”. Para contar desde el final sin saber cuántos elementos hay, existen los índices negativos.Pista 2: para las dos primeras, corta desde el inicio hasta el índice 2; para la última, un solo índice negativo; para las dos últimas, un inicio negativo; para todas menos la primera, empieza el corte en 1.
Ejercicio 5.8: El Reparto (Unpacking)
- Crea la tupla
envio = ("PRD-101", "Tornillos", 500). - Desempácala en tres variables:
codigo,nombre,cantidad, e imprime cada una. - Ahora el clásico: crea
a = "Pasillo 1"yb = "Pasillo 2", e intercámbialas en UNA sola línea (sin variable temporal). Imprime ambas para confirmar el intercambio.
Pista 1: Python puede asignar varios valores a la vez si el número de variables a la izquierda coincide con el número de elementos a la derecha.
Pista 2: desempaca la tupla asignándola a varios nombres separados por comas en una sola línea; el intercambio de dos variables es un caso especial de ese mismo truco. Python arma el lado derecho completo antes de reasignar.
Ejercicio 5.9: Las Dos Etiquetas (Aliasing y .copy())
El bug de la copia que no copia, provocado a propósito para que lo reconozcas:
- Crea
original = ["Martillo", "Sierra"]y luegorespaldo = original(sin.copy()). - Antes de tocar nada: si agregas
"Taladro"arespaldo, ¿qué crees que va a conteneroriginal? Anota tu predicción. - Agrega
"Taladro"arespaldo, imprimeoriginaly compara con lo que predijiste. ¿Qué pasó y por qué? - Repite el experimento, pero ahora crea el respaldo con
original.copy(). Comprueba que esta vez el original queda intacto. - Verifica ambas situaciones con
is(¿son el mismo estante o dos distintos?). Adelanto:ispregunta si son el mismo estante; el Capítulo 6 lo formaliza.
Pista 1:
respaldo = originalno crea una lista nueva; ambos nombres terminan apuntando al mismo estante en memoria, así que modificar uno afecta al otro.Pista 2:
.copy()(olist(original)) sí crea un estante independiente con el mismo contenido, así que modificar uno no toca al otro; comprueba ambos casos conoriginal is respaldo, que daTruemientras compartan estante yFalseen cuanto uses.copy(). Esa es la prueba definitiva, más confiable que solo mirar el contenido.
Soluciones: en el Apéndice B está la solución de cada ejercicio. Inténtalo por tu cuenta antes de consultarla.
Con las cajas y los muebles organizados, en el siguiente capítulo le damos verbos al almacén: los operadores que calculan, comparan y combinan todo lo que ya sabes guardar.