En este post vamos a resolver un ejercicio de aminoácidos con Python.
Tiene que ver con programación orientada a objetos, listas, archivos y diccionarios. El ejercicio sirve para repasar varios conceptos de programación en Python.
Descripción del ejercicio
Veamos los detalles a continuación.
Se necesita un sistema para procesar diversos estudios sobre aminoácidos. Se pide crear la clase Estudio
y realizar un programa con varias operaciones para trabajar con dichos estudios.
Parte 1: Clase Estudio
Se solicita crear la clase Estudio. Los atributos son:
- descripción del estudio (string)
- secuencia de aminoácidos del estudio (string, ej. “ALAGLYALAVALALA”, nota: cada aminoácido está representado por 3 letras mayúsculas)
- resultado (número entero entre O y 5)
Implementar además los métodos para:
Al imprimir un objeto, deben mostrarse siempre con el siguiente formato presentado en el ejemplo:
Si se tiene el estudio de descripción: “Análisis primario”, con la secuencia “ALAGLYALAVALALA”” (la cual contiene 3 aminoácidos diferentes: “ALA”, “GLY” y “VAL”) y resultado 5, se mostrará así:
Estudio: Análisis Primario Secuencia: ALAGLYALAVALALA Resultado: 5 Contiene: 3
método cualesAminoacidos, que retorna una lista de los aminoácidos incluidos en la secuencia, sin repeticiones.
Ejemplo: para el estudio definido con secuencia “ALAGLYALAVALALA”
, devolvería
[ALA””GLY”,VAL”]
método contiene(cual), recibe un aminoácido y retorna verdadero si el estudio lo contiene o falso en otro caso.
Ejemplo: para el estudio definido con secuencia “ALAGLYALAVALALA”, si se consulta “VAL”, retornaría True
.
Parte 2: Programa
Al comienzo del programa, los datos de los aminoácidos que van a participar de los estudios a realizar deben cargarse a partir de un archivo de texto a un diccionario.
La ruta y nombre del archivo la indicará el usuario. El formato de cada línea del archivo es:
nombre aminoácido#código largo en 3 letras#código corto en 1 letra#peso molecular
Se asumen todos los datos correctos.
Ejemplo de posible archivo:
Alanine#Ala#A#89.1
Glutamine#Gln#Q#146.2
Arginine#Arg#R#174.2
Asparagine#Asn#N#132.1
Glutamate#Glu#E#147.1
Glycine#Gly#G#75.1
Histidine#His#H#155.2
Proline#Pro#P#115.1
Valine#Val#V#117.1
Serine#Ser#S#105.1
El diccionario tendrá cómo clave el código largo en mayúscula y cómo valor a una tupla con el nombre, el código corto y el peso.
En el programa se trabajará con el diccionario de los aminoácidos y una lista donde se guardarán los estudios.
Menú
Luego de cargar el diccionario, se ofrecerá un menú con:
1.Agregar un estudio en la lista. Solicitar los datos de un estudio (descripción, secuencia de aminoácidos y resultado. Cada aminoácido se representa por 3 letras mayúsculas).
Debe verificarse que cada aminoácido de la secuencia esté en el diccionario, que la descripción del estudio no esté repetida y que el resultado del estudio sea de 0 a 5.
Sólo se agrega en la lista si está completamente correcto y además, a modo informativo, se muestran todos los datos del estudio y el peso molecular correspondiente.
2. Mostrar estudios. Mostrar todos los estudios registrados.
3. Consulta de estudios con aminoácido. Se indica un aminoácido (3 letras mayúsculas) y se muestra la lista de estudios que lo contienen. La lista debe estar ordenada alfabéticamente por descripción.
4. Consulta de aminoácidos diferentes. Mostrar cuál es el estudio que tuvo la mayor cantidad de aminoácidos diferentes. Si hubiere varios con la misma cantidad, mostrarlos todos ellos.
5. Exportar estudios. Se ingresa el resultado a considerar y el nombre y ruta del archivo. Se grabará una línea por cada estudio que sea del resultado indicado. El formato es el presentado en la parte 1, por ejemplo:
Estudio: Análisis Primario Secuencia: ALAGLYALAVALALA Resultado: 5 Contiene: 3
6. Aminoácidos faltantes. A partir de los aminoácidos cargados en el sistema, indicar cuáles no participaron en ningún estudio. Mostrarlos incluyendo su nombre, código largo y código corto.
7. Fin
Solución al ejercicio
Ya expliqué la descripción, ahora veamos la solución:
import os
class Estudio():
descripcion = ""
secuencia = ""
resultado = 0
def __init__(self, descripcion, secuencia, resultado):
self.descripcion = descripcion
self.secuencia = secuencia
self.resultado = resultado
def __str__(self) -> str:
cantidad = len(self.cualesAminoacidos())
return f"{self.descripcion} Secuencia: {self.secuencia} Resultado: {self.resultado} Contiene: {cantidad}"
def cualesAminoacidos(self):
inicio = 0
longitud_aminoacido = 3
aminoacidos = []
while inicio < len(self.secuencia):
aminoacido = self.secuencia[inicio:inicio+longitud_aminoacido]
if aminoacido not in aminoacidos:
aminoacidos.append(aminoacido)
inicio += longitud_aminoacido
return aminoacidos
def contiene(self, cual):
aminoacidos = self.cualesAminoacidos()
return cual in aminoacidos
def obtener_aminoacidos_a_partir_de_archivo(ruta_archivo):
separador = "#"
diccionario = {}
with open(ruta_archivo) as archivo:
for linea in archivo:
linea = linea.rstrip()
separada = linea.split(separador)
nombre_aminoacido = separada[0]
codigo_largo = separada[1]
codigo_corto = separada[2]
peso_molecular = separada[3]
diccionario[codigo_largo.upper()] = (
nombre_aminoacido, codigo_corto, peso_molecular)
return diccionario
# Ayudante para ordenar
def funcion_que_devuelve_clave(estudio):
return estudio.descripcion
def consulta_de_estudios_con_aminoacido(estudios):
aminoacido = input("Ingrese el aminoácido: ")
lista_filtrada = []
for estudio in estudios:
if aminoacido in estudio.cualesAminoacidos():
lista_filtrada.append(estudio)
lista_ordenada = sorted(lista_filtrada, key=funcion_que_devuelve_clave)
return lista_ordenada
def solicitar_y_agregar_estudio(estudios, diccionario):
descripcion = input("Ingrese la descripción: ")
secuencia = input("Ingrese la secuencia: ")
resultado = int(input("Ingrese el resultado: "))
estudio = Estudio(descripcion, secuencia, resultado)
aminoacidos = estudio.cualesAminoacidos()
for aminoacido in aminoacidos:
if not aminoacido in diccionario:
print(
f"El aminoácido {aminoacido} no se encuentra en el diccionario. Imposible agregar")
return
for estudio_existente in estudios:
if estudio_existente.descripcion == descripcion:
print(
f"Ya existe un estudio con la descripción {descripcion}. Imposible agregar")
return
if resultado < 0 or resultado > 5:
print("El resultado debe estar entre 0 y 5. Imposible agregar")
return
# Pasamos todas las validaciones. Lo agregamos a la lista
estudios.append(estudio)
def mostrar_estudios(estudios):
for estudio in estudios:
print(estudio)
def mayor_cantidad_aminoacidos_diferentes(estudios):
if len(estudios) <= 0:
return 0
mayor_cantidad = len(estudios[0].cualesAminoacidos())
for estudio in estudios:
if len(estudio.cualesAminoacidos()) > mayor_cantidad:
mayor_cantidad = len(estudio.cualesAminoacidos())
return mayor_cantidad
def consulta_de_aminoacidos_diferentes(estudios):
mayor_cantidad = mayor_cantidad_aminoacidos_diferentes(estudios)
estudios_con_mayor_cantidad = []
for estudio in estudios:
if len(estudio.cualesAminoacidos()) >= mayor_cantidad:
estudios_con_mayor_cantidad.append(estudio)
return estudios_con_mayor_cantidad
def exportar_estudios(estudios):
resultado = int(input("Ingrese el resultado a considerar: "))
ruta = input("Ingrese la ruta completa del archivo para exportar: ")
with open(ruta, "w", encoding='utf-8') as archivo:
for estudio in estudios:
if estudio.resultado == resultado:
archivo.write(str(estudio)+"\n")
def aminoacido_existe_en_algun_estudio(aminoacido, estudios):
for estudio in estudios:
if estudio.contiene(aminoacido):
return True
return False
def aminoacidos_faltantes(aminoacidos, estudios):
for codigo_largo in aminoacidos:
aminoacido = aminoacidos.get(codigo_largo)
nombre, codigo_corto, peso = aminoacido
if not aminoacido_existe_en_algun_estudio(codigo_largo, estudios):
print(f"{nombre} {codigo_largo} {codigo_corto}")
def menu():
ruta_archivo = input("Ingrese la ruta completa del archivo: ")
if not os.path.isfile(ruta_archivo):
print("El archivo no existe")
return
aminoacidos = obtener_aminoacidos_a_partir_de_archivo(ruta_archivo)
estudios = []
menu = """
1. Agregar estudio a la lista
2. Mostrar estudios
3. Consulta de estudios con aminoácidos
4. Consulta de aminoácidos diferentes
5. Exportar estudios
6. Aminoácidos faltantes
7. Salir
Elige una opción: """
while True:
eleccion = input(menu)
if eleccion == "7":
return
if eleccion == "1":
solicitar_y_agregar_estudio(estudios, aminoacidos)
elif eleccion == "2":
mostrar_estudios(estudios)
elif eleccion == "3":
mostrar_estudios(consulta_de_estudios_con_aminoacido(estudios))
elif eleccion == "4":
mostrar_estudios(consulta_de_aminoacidos_diferentes(estudios))
elif eleccion == "5":
exportar_estudios(estudios)
elif eleccion == "6":
aminoacidos_faltantes(aminoacidos, estudios)
if __name__ == "__main__":
menu()
El ejercicio cumple con todos los requisitos. Para terminar te dejo con 5.