Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created July 27, 2022 16:35
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 parzibyte/80f1102b30a0db33c811af444b8afcf3 to your computer and use it in GitHub Desktop.
Save parzibyte/80f1102b30a0db33c811af444b8afcf3 to your computer and use it in GitHub Desktop.
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