Saltar a contenido

Consulta médica

Una consulta médica tiene un archivo pacientes.txt con los datos personales de sus pacientes. Cada línea del archivo tiene el rut, el nombre y la edad de un paciente, separados por un símbolo :.

Así se ve el archivo:

pacientes.txt
12067539-7:Anastasia López:32
15007265-4:Andrés Morales:26
8509454-8:Pablo Muñoz:45
7752666-8:Ignacio Navarro:49
8015253-1:Alejandro Pacheco:51
9217890-0:Patricio Pimienta:39
9487280-4:Ignacio Rosas:42
12393241-2:Ignacio Rubio:33
11426761-9:Romina Pérez:35
15690109-1:Francisco Ruiz:26
6092377-9:Alfonso San Martín:65
9023365-3:Manuel Toledo:38
10985778-5:Jesús Valdés:38
13314970-8:Abel Vázquez:30
7295601-k:Edison Muñoz:60
5106360-0:Andrea Vega:71
8654231-5:Andrés Zambrano:55
10105321-0:Antonio Almarza:31
13087677-3:Jorge Álvarez:28
9184011-1:Laura Andrade:47
12028339-1:Jorge Argandoña:29
10523653-0:Camila Avaria:40
12187197-1:Felipe Ávila:36
5935556-2:Aquiles Barriga:80
14350739-4:Eduardo Bello:29
6951420-0:Cora Benítez:68
11370775-5:Hugo Berger:31
11111756-k:Cristóbal Bórquez:34

Además, cada vez que alguien se atiende en la consulta, la visita es registrada en el archivo atenciones.txt, agregando una línea que tiene el rut del paciente, la fecha de la visita (en formato dia-mes-año) y el precio de la atención, también separados por :. El archivo se ve así:

atenciones.txt
8015253-1:4-5-2010:69580
12393241-2:6-5-2010:57274
10985778-5:8-5-2010:73206
8015253-1:10-5-2010:30796
8015253-1:12-5-2010:47048
12028339-1:12-5-2010:47927
11426761-9:13-5-2010:39117
10985778-5:15-5-2010:86209
7752666-8:18-5-2010:41916
8015253-1:18-5-2010:74101
12187197-1:20-5-2010:38909
8654231-5:20-5-2010:75018
8654231-5:22-5-2010:64944
5106360-0:24-5-2010:53341
8015253-1:27-5-2010:76047
9217890-0:30-5-2010:57726
7752666-8:1-6-2010:54987
8509454-8:2-6-2010:76483
6092377-9:2-6-2010:62106
11370775-5:3-6-2010:67035
11370775-5:7-6-2010:47299
8509454-8:7-6-2010:73254
8509454-8:10-6-2010:82955
11111756-k:10-6-2010:56520
7752666-8:10-6-2010:40820
12028339-1:12-6-2010:79237
11111756-k:13-6-2010:69094
5935556-2:14-6-2010:73174
11111756-k:21-6-2010:70417
11426761-9:22-6-2010:80217
12067539-7:25-6-2010:31555
11370775-5:26-6-2010:75796
10523653-0:26-6-2010:34585
6951420-0:28-6-2010:45433
5106360-0:1-7-2010:48445
8654231-5:4-7-2010:76458

Note que las fechas están ordenadas de menos a más reciente, ya que las nuevas líneas siempre se van agregando al final.

  1. Escriba la función costo_total_paciente(rut) que entregue el costo total de las atenciones del paciente con el rut dado:
    >>> costo_total_paciente('8015253-1')
    297572
    >>> costo_total_paciente('14350739-4')
    0
    
  2. Escriba la función pacientes_dia(dia, mes, año) que entregue una lista con los nombres de los pacientes que se atendieron el día señalado:
    >>> pacientes_dia(2, 6, 2010)
    ['Pablo Muñoz', 'Alfonso San Martín']
    >>> pacientes_dia(23, 6, 2010)
    []
    
  3. Escriba la función separar_pacientes() que construya dos nuevos archivos:

    • jovenes.txt, con los datos de los pacientes menores de 30 años;
    • mayores.txt, con los datos de todos los pacientes mayores de 60 años.

    Por ejemplo, el archivo jovenes.txt debe verse así:

    15007265-4:Andrés Morales:26
    15690109-1:Francisco Ruiz:26
    13087677-3:Jorge Álvarez:28
    12028339-1:Jorge Argandoña:29
    14350739-4:Eduardo Bello:29
    
    4. Escribir una función ganancias_por_mes() que construya un nuevo archivo llamado ganancias.txt que tenga el total de ganancias por cada mes en el siguiente formato:
    5-2010:933159
    6-2010:1120967
    7-2010:124903
    

Solución
# Pregunta 1
def costo_total_paciente(rut):
    atenciones = open("atenciones.txt")
    costo = 0 # Variable para guardar el costo
    for linea in atenciones:
        datos = linea.strip().split(":") # Separamos los datos
        if rut == datos[0]: # Si es el rut que se consulta
            costo += int(datos[2]) # Sumamos el costo
    atenciones.close()
    return costo

# Pregunta 2
def pacientes_dia(dia, mes, año):
    pacientes = open("pacientes.txt")
    atenciones = open("atenciones.txt")
    ruts = []
    nombres = []
    # Recorremos las atenciones para obtener los ruts 
    for linea in atenciones: 
        datos = linea.strip().split(":")
        fecha = datos[1].split("-") # Separamos las fechas
        # Comparamos si corresponde a la fecha
        if int(fecha[0]) == dia and int(fecha[1]) == mes and int(fecha[2]) == año:
            if datos[0] not in ruts:
                ruts.append(datos[0]) # Guardamos el rut
    # Recorremos los pacientes 
    for linea in pacientes: 
        datos = linea.strip().split(":")
        # Revisamos si el rut del paciente esta en la estructura donde guardamos los ruts
        if datos[0] in ruts: 
            nombres.append(datos[1])
    # Cierre de archivos
    pacientes.close()
    atenciones.close()
    return nombres

# Pregunta 3
def separar_pacientes():
    # Abrir archivos
    pacientes = open("pacientes.txt")
    jovenes = open("jovenes.txt", "w")
    mayores = open("mayores.txt", "w")
    for linea in pacientes: # Leer lineas del archivo
        datos = linea.split(":")
        # Filtrar segun edad
        if int(datos[2]) < 30:
            jovenes.write(linea)
        elif int(datos[2]) > 60:
            mayores.write(linea)
    # Cierre de archivos
    pacientes.close()
    jovenes.close()
    mayores.close()

# Pregunta 4
def ganancias_por_mes():
    atenciones = open("atenciones.txt")
    ganancias = dict() # Diccionario para guardar informacion
    for linea in atenciones: # Recorremos las lineas del archivo
        datos = linea.split(":") # Separamos los datos
        fecha = datos[1].split("-") # Separamos la fecha
        mes_año = "-".join(fecha[1:]) # Solo nos quedamos con mes-año
        if mes_año not in ganancias: # Guardamos los montos en cada mes-año
            ganancias[mes_año] = 0
        ganancias[mes_año] += int(datos[2])
    atenciones.close()
    # Ordenemos la informacion por fecha utilizando una lista de tuplas
    lista = [] # [((año, mes), ganancia), ...] asi podemos ordenar la estructura rapidamente
    for mes_año in ganancias:
        fecha = mes_año.split("-") # Separamos mes y año
        tupla = ((int(fecha[1]), int(fecha[0])), ganancias[mes_año]) # Creamos la lista de tuplas
        lista.append(tupla)
    lista.sort() # Ordenara de forma ascendente por la fecha
    gan = open("ganancias.txt", "w")
    # Guardamos la informacion en el archivo
    for fecha, ganancia in lista:
        año, mes = fecha
        gan.write("{}-{}:{}\n".format(mes, año, ganancia))
    gan.close()

# Pruebas
print(costo_total_paciente('8015253-1'))
print(costo_total_paciente('14350739-4'))
print(pacientes_dia(2, 6, 2010))
print(pacientes_dia(23, 6, 2010))
separar_pacientes()
ganancias_por_mes()