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.
- 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 - 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) [] -
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.txtdebe verse así:4. Escribir una función15007265-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:29ganancias_por_mes()que construya un nuevo archivo llamadoganancias.txtque 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()