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.txt
debe 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:29
ganancias_por_mes()
que construya un nuevo archivo llamadoganancias.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()