You are on page 1of 8

Taller Parcial 3

1. Suponga que ha sido contratado como ingeniero de software para diseñar y administrar el sistema de
datos de una pequeña tienda de pintura llamada "ColorArte". Su tarea es crear una estructura de datos
en Python que permita gestionar el inventario de pinturas, así como analizar las cantidades disponibles
y las ventas proyectadas.

Los atributos de cada pintura incluyen:

Nombre: el nombre específico de la pintura.


Cantidad Disponible: la cantidad actualmente disponible en el inventario.
Ventas del mes: la cantidad actual de ventas en el mes.
Ventas Proyectadas del mes: la cantidad estimada de ventas para un período determinado.

Su tarea consiste en implementar las siguientes funciones:

agregar_pintura(nombre ,cantidad_disponible, ventas_mes, ventas_proyectadas_mes) agrega una


nueva pintura al inventario

obtener_pinturas_necesarias() devuelve una lista de las pinturas que necesitan ser vendidas en el mes
actual

se espera que defina la estructura de datos adecuada, implemente las funciones mencionadas y realice
pruebas para verificar su correcto funcionamiento.

Recuerde que el objetivo principal es proporcionar a la tienda de pintura una forma eficiente de gestionar
su inventario y tomar decisiones informadas sobre qué pinturas deben ser vendidas y cuáles no en el
mes actual.

Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual


Solución:
# Definición del diccionario de pinturas
diccionario_pinturas = {
"Rojo Brillante": [10, 5, 8], # Cantidad Disponible, Ventas del Mes, Ventas
Proyectadas del Mes
"Azul Turquesa": [5, 2, 0],
"Verde Esmeralda": [0, 0, 10],
"Amarillo Sol": [2, 1, 3]
}

# Función para agregar una pintura al diccionario


def agregar_pintura(clave, cantidad_disponible, ventas_mes,
ventas_proyectadas_mes):
diccionario_pinturas[clave] = [cantidad_disponible, ventas_mes,
ventas_proyectadas_mes]

# Función para obtener las pinturas que necesitan ser vendidas en el mes actual
def obtener_pinturas_necesarias(diccionario_pinturas):
pinturas_necesarias = []
for clave, atributos in diccionario_pinturas.items():
cantidad_disponible = atributos[0]
ventas_proyectadas_mes = atributos[2]
if cantidad_disponible <= 0 and ventas_proyectadas_mes > 0:
pinturas_necesarias.append(clave)
return pinturas_necesarias

# Función para obtener las pinturas que no necesitan ser vendidas en el mes actual
def obtener_pinturas_no_necesarias(diccionario_pinturas):
pinturas_no_necesarias = []
for clave, atributos in diccionario_pinturas.items():
cantidad_disponible = atributos[0]
ventas_proyectadas_mes = atributos[2]
if cantidad_disponible > 0 or ventas_proyectadas_mes == 0:
pinturas_no_necesarias.append(clave)
return pinturas_no_necesarias

# Agregar una nueva pintura al diccionario


agregar_pintura("Gris Plata", 8, 3, 5)

# Obtener las pinturas que necesitan ser vendidas en el mes actual


pinturas_necesarias = obtener_pinturas_necesarias(diccionario_pinturas)
print("Pinturas necesarias para ser vendidad:", pinturas_necesarias)

# Obtener las pinturas que no necesitan ser vendidas en el mes actual


pinturas_no_necesarias = obtener_pinturas_no_necesarias(diccionario_pinturas)
print("Pinturas no necesarias:", pinturas_no_necesarias)

Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual


2. Imagina que eres el responsable de analizar los datos de un sistema de monitoreo de fauna en una
reserva natural. El sistema registra avistamientos de diferentes especies de animales a lo largo de varios
días. Actualmente, el análisis se realiza mediante un algoritmo ineficiente que utiliza dos ciclos anidados
para encontrar todas las parejas de avistamientos de animales que pertenecen a la misma especie.

Tu tarea consiste en mejorar la eficiencia del algoritmo, reduciendo la cantidad de iteraciones en al


menos un 5% en comparación con la versión ineficiente. Esto permitirá agilizar el análisis de los datos y
obtener resultados más rápidamente.

def encontrar_parejas_ineficiente(registros):
parejas = [] # Lista para almacenar las parejas de avistamientos
iteraciones = 0 # Contador de iteraciones

for i in range(len(registros)): #ireacion sobre avistamientos


especie_1 = registros[i][0]
fecha_1 = registros[i][1]

for j in range(i+1, len(registros)): #2 iteracion sobre cada avistamientos


especie_2 = registros[j][0]
fecha_2 = registros[j][1]

if especie_1 == especie_2: #Buscamos parejas


parejas.append((especie_1, fecha_1, fecha_2))

iteraciones += 1 # Incrementar el contador de iteraciones en cada


iteración del ciclo anidado

return parejas, iteraciones

# Ejemplo de uso
registros = [("León", "2023-05-15"), ("Tigre", "2023-05-16"), ("León", "2023-05-
17"), ("Leopardo", "2023-05-18")]
parejas_ineficiente, iteraciones_ineficiente =
encontrar_parejas_ineficiente(registros)

print("Parejas (ineficiente):", parejas_ineficiente)


print("Iteraciones (ineficiente):", iteraciones_ineficiente)

Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual


Solución:
Al utilizar un diccionario para almacenar las especies y las fechas de avistamiento en lugar de utilizar
dos ciclos anidados, se reducirá significativamente la cantidad de iteraciones necesarias para encontrar
las parejas de avistamientos de la misma especie, implementando funcionalidades propias de los
diccionarios.

def encontrar_parejas_eficiente(registros):
parejas = [] # Lista para almacenar las parejas de avistamientos
iteraciones = 0 # Contador de iteraciones
especies = {} # Diccionario para almacenar las especies y las fechas de
avistamiento

for registro in registros: #ireacion sobre avistamientos


especie = registro[0]
fecha = registro[1]
#Aprovechamos la funcionalidad del if para realizar una busqueda
completa sobre un diccionario auxiliar
if especie in especies: #Buscamos parejas en el diccionario auxiliar
parejas.append((especie, especies[especie], fecha))
else:
especies[especie] = fecha

iteraciones += 1 # Incrementar el contador de iteraciones en cada


iteración del ciclo principal

return parejas, iteraciones

# Ejemplo de uso
registros = [("León", "2023-05-15"), ("Tigre", "2023-05-16"), ("León",
"2023-05-17"), ("Leopardo", "2023-05-18")]
parejas_eficiente, iteraciones_eficiente =
encontrar_parejas_eficiente(registros)

print("Parejas (eficiente):", parejas_eficiente)


print("Iteraciones (eficiente):", iteraciones_eficiente)

Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual


3. Imagina que estás desarrollando un sistema de gestión de inventario para una tienda de libros. La
información del inventario se organiza en una estructura de datos con dos niveles de anidación. En el
primer nivel, se almacenan los géneros literarios y en el segundo nivel se encuentran los libros asociados
a cada género.

Ejemplo:
inventario = {
'Ficción': {
'1984': ['George Orwell', 10],
'Cien años de soledad': ['Gabriel García Márquez', 15]
},
'Misterio': {
'El código Da Vinci': ['Dan Brown', 8],
'La chica del tren': ['Paula Hawkins', 12]
},
'Romance': {
'Orgullo y prejuicio': ['Jane Austen', 5],
'Bajo la misma estrella': ['John Green', 3]
}
}

Tu objetivo es implementar dos de las siguientes funciones, que permitan administrar esta la base de
datos:
• agregar_libro(genero, titulo, autor, stock): Agrega un libro al inventario. Si el género literario no
existe, se crea automáticamente.
• eliminar_libro(genero, titulo): Elimina un libro específico del inventario. Si el género se queda sin
libros, se elimina también.
• actualizar_stock(genero, titulo, cantidad): Actualiza el stock de un libro específico en el inventario.
• obtener_stock_total(): Calcula y devuelve el stock total de libros en el inventario.
• obtener_stock(genero, titulo): devuelve el stock de un libro en el inventario.

Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual


Solución:
inventario = {}

def agregar_libro(genero, titulo, autor, stock):


if genero in inventario:
inventario[genero].append({'titulo': titulo, 'autor': autor,
'stock': stock})
else:
inventario[genero] = [{'titulo': titulo, 'autor': autor, 'stock':
stock}]

def eliminar_libro(genero, titulo):


if genero in inventario:
libros_genero = inventario[genero]
for libro in libros_genero:
if libro['titulo'] == titulo:
libros_genero.remove(libro)
break
if len(libros_genero) == 0:
del inventario[genero]

def mostrar_inventario():
for genero, libros_genero in inventario.items():
print(genero)
for libro in libros_genero:
print(f"- {libro['titulo']} ({libro['autor']}) - Stock:
{libro['stock']}")

# Ejemplo de uso
# Agregar libros
agregar_libro('Ficción', '1984', 'George Orwell', 10)
agregar_libro('Ficción', 'Cien años de soledad', 'Gabriel García Márquez',
15)
agregar_libro('Misterio', 'El código Da Vinci', 'Dan Brown', 8)
agregar_libro('Misterio', 'La chica del tren', 'Paula Hawkins', 12)
agregar_libro('Romance', 'Orgullo y prejuicio', 'Jane Austen', 5)
agregar_libro('Romance', 'Bajo la misma estrella', 'John Green', 3)

# Mostrar inventario antes de eliminar libro


mostrar_inventario()
print("-------------------------------------------------------")

# Eliminar libro
eliminar_libro('Misterio', 'La chica del tren')

# Mostrar inventario después de eliminar libro


mostrar_inventario()
Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual
Extras: Administración de diccionarios:

Crear un diccionario:
Puedes crear un diccionario utilizando la siguiente sintaxis:

mi_diccionario = {"clave1": valor1, "clave2": valor2, ...}

Acceder a los valores de un diccionario:


Puedes acceder a los valores de un diccionario utilizando las claves correspondientes:

valor = mi_diccionario["clave"]

Modificar un valor en un diccionario:


Puedes modificar el valor asociado a una clave en un diccionario asignando un nuevo valor:

mi_diccionario["clave"] = nuevo_valor

Añadir un nuevo par clave-valor:


Puedes añadir un nuevo par clave-valor a un diccionario utilizando la siguiente sintaxis:

mi_diccionario["nueva_clave"] = nuevo_valor

Eliminar un par clave-valor:


Puedes eliminar un par clave-valor de un diccionario utilizando la palabra clave del:

del mi_diccionario["clave"]

Verificar si una clave existe en un diccionario:


Puedes verificar si una clave está presente en un diccionario utilizando el operador in:

if "clave" in mi_diccionario:
# La clave está presente
else:
# La clave no está presente

Recorrer un diccionario:
Puedes recorrer un diccionario utilizando un bucle for y accediendo a las claves y valores:

for clave, valor in mi_diccionario.items():


# Hacer algo con la clave y el valor

Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual


Diccionarios de 2 niveles:

Crear un diccionario de dos niveles:


Puedes crear un diccionario de dos niveles utilizando la siguiente sintaxis:

mi_diccionario = {"clave1": {"subclave1": valor1, "subclave2": valor2,


...}, "clave2": {"subclave3": valor3, "subclave4": valor4, ...}, ...}

Acceder a los valores de un diccionario de dos niveles:


Puedes acceder a los valores de un diccionario de dos niveles utilizando las claves correspondientes para
ambos niveles:

valor = mi_diccionario["clave1"]["subclave1"]

Modificar un valor en un diccionario de dos niveles:


Puedes modificar el valor asociado a una subclave en un diccionario de dos niveles asignando un nuevo valor:

mi_diccionario["clave1"]["subclave1"] = nuevo_valor

Añadir un nuevo par clave-valor en un diccionario de dos niveles:


Puedes añadir un nuevo par clave-valor en un diccionario de dos niveles utilizando la siguiente sintaxis:

mi_diccionario["clave1"]["nueva_subclave"] = nuevo_valor

Eliminar un par clave-valor de un diccionario de dos niveles:


Puedes eliminar un par clave-valor de un diccionario de dos niveles utilizando la palabra clave `del`:

del mi_diccionario["clave1"]["subclave1"]

Recorrer un diccionario de dos niveles:


Puedes recorrer un diccionario de dos niveles utilizando bucles `for` anidados para acceder a las claves y
valores de ambos niveles:

for clave1, diccionario_nivel2 in mi_diccionario.items():


for subclave, valor in diccionario_nivel2.items():
# Hacer algo con la clave1, subclave y valor

Universidad de Antioquia – Facultad de Ingeniería – Ude@ Educación Virtual

You might also like