Skip to content

Instantly share code, notes, and snippets.

@tiagox
Last active September 23, 2018 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiagox/576b0cc311ac18f02fb4b54ffac38a0a to your computer and use it in GitHub Desktop.
Save tiagox/576b0cc311ac18f02fb4b54ffac38a0a to your computer and use it in GitHub Desktop.
Ejercicio de ejemplo de la materia Estructura de Datos.

Se tiene un diccionario carreras que tiene como clave el nombre de una carrera y como contenido una lista de materias. Por ejemplo, podemos tener:

carreras = {
    “música”: [“historia”, “piano 1”, “piano 2”, “guitarra”, “composición”],
    “pintura”: [“historia”, “dibujo 1”, “dibujo 2”, “pintura 1”, “pintura 2”] 
}

Se tiene también un diccionario alumnos, cuya clave es el legajo y como datos una tupla con nombre, lista de carreras en las que está inscripto y un diccionario con clave nombre de la materia y lista de notas (puede aparecer más de una nota solamente si el alumno no aprobó la materia la primera vez). Por ejemplo:

alumnos = {
    1000: ("Ana", ["música", "pintura"], {"historia": [2, 10], "piano 1": [8], "piano 2": [2]}),
    2000: ("Juan", ["pintura"], {"historia": [6], "dibujo 1": [8], "pintura 1": [2, 7], "dibujo 2": [2]})
}
  1. Para ayudar al Departamento de Alumnos se debe escribir una función Python que_le_falta que recibe los diccionarios carreras y alumnos, un número de legajo y una carrera como datos, y devuelve una lista con las materias que le faltan a ese legajo para completar esa carrera.

    Si la carrera no existe se debe lanzar la excepción CarreraDesconocidaError (definirla adecuadamente). Si el legajo no existe se debe lanzar la excepción LegajoDesconocidoError (definirla adecuadamente).

    Por ejemplo, con los diccionarios anteriores, el legajo 1000 y la carrera "música" se debe devolver la lista:

    [“piano 2”, “guitarra”, “composición”] # ¿Qué le falta a Ana para completar la carrera “música”?
  2. Escribir una función guardar_carreras_en_disco que recibe un diccionario carreras y un nombre de archivo y guarda el diccionario de carreras en el archivo indicado.

  3. Escribir una función recuperar_carreras_de_disco que recibe un nombre de archivo y recupera el diccionario carreras a partir del archivo indicado.

import pickle
def que_le_falta(cerreras, alumnos, legajo, carrera):
if carrera not in carreras.keys():
raise CarreraDesconocidaError('No existe la carrera: ' + carrera)
if legajo not in alumnos.keys():
raise LegajoDesconocidoError(
'No existe un alumno con el legajo: ' + str(legajo))
(_, _, historial) = alumnos.get(legajo)
# Usando una lista por comprensión filtramos el listado de materias aprobadas del alumno.
materias_aprobadas = [materia for materia in historial.keys(
) if esta_aprobada(historial.get(materia))]
# Usamos teoría de conjuntos para hacer la diferencia,
# eso nos dá todas las materiass de la carrera que no
# están en la lista de materias aprobadas del alumno.
return list(set(carreras.get(carrera)) - set(materias_aprobadas))
def esta_aprobada(notas):
'''
Chequea solo la última nota en el historial,
asumiendo que están ordenadas de forma cronológica
y que nadie va a rendin un examen una vez que ya lo aprobó.
'''
return notas[-1] >= 4
class CarreraDesconocidaError(Exception):
pass
class LegajoDesconocidoError(Exception):
# Usando `pass` indicamos que no vamos a hacer nada más que crear
# una clase que es igual a Exception pero con un nuevo nombre.
pass
def guardar_carreras_en_disco(carreras, nombre_archivo):
with open(nombre_archivo, 'wb') as archivo:
pickle.dump(carreras, archivo)
def recuperar_carreras_de_disco(nombre_archivo):
with open(nombre_archivo, 'rb') as archivo:
return pickle.load(archivo)
if __name__ == "__main__":
carreras = {
"música": ["historia", "piano 1", "piano 2", "guitarra", "composición"],
"pintura": ["historia", "dibujo 1", "dibujo 2", "pintura 1", "pintura 2"]
}
alumnos = {
1000: ("Ana", ["música", "pintura"], {"historia": [2, 10], "piano 1": [8], "piano 2": [2]}),
2000: ("Juan", ["pintura"], {"historia": [6], "dibujo 1": [8], "pintura 1": [2, 7], "dibujo 2": [2]})
}
print(que_le_falta(carreras, alumnos, 1000, "pintura"))
print(que_le_falta(carreras, alumnos, 1000, "música"))
print(que_le_falta(carreras, alumnos, 2000, "pintura"))
try:
print(que_le_falta(carreras, alumnos, 1000, "artes"))
except CarreraDesconocidaError as e:
print(e)
try:
print(que_le_falta(carreras, alumnos, 3000, "pintura"))
except LegajoDesconocidoError as e:
print(e)
guardar_carreras_en_disco(carreras, 'carreras.pickle')
print(recuperar_carreras_de_disco('carreras.pickle'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment