-
-
Save parzibyte/80f1102b30a0db33c811af444b8afcf3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment