python

Python – Ejercicio resuelto de aminoácidos

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.