Tell us what’s happening:
I am confused. Isn’t the final step here just changing is_invalid to True inside the nested loop? I tried invalidating the output by changing some of the keys and values and it only gives me traceback errors (I tried checking this and so no errors with my code). However, currently it just outputs “Valid format.” and your code raised an error…
Your code so far
import re
medical_records = [
{
'patient_id': 'P1001',
'age': 34,
'gender': 'Female',
'diagnosis': 'Hypertension',
'medications': ['Lisinopril'],
'last_visit_id': 'V2301',
},
{
'patient_id': 'p1002',
'age': 47,
'gender': 'male',
'diagnosis': 'Type 2 Diabetes',
'medications': ['Metformin', 'Insulin'],
'last_visit_id': 'v2302',
},
{
'patient_id': 'P1003',
'age': 29,
'gender': 'female',
'diagnosis': 'Asthma',
'medications': ['Albuterol'],
'last_visit_id': 'v2303',
},
{
'patient_id': 'p1004',
'age': 56,
'gender': 'Male',
'diagnosis': 'Chronic Back Pain',
'medications': ['Ibuprofen', 'Physical Therapy'],
'last_visit_id': 'V2304',
}
]
def find_invalid_records(
patient_id, age, gender, diagnosis, medications, last_visit_id
):
constraints = {
'patient_id': isinstance(patient_id, str)
and re.fullmatch('p\d+', patient_id, re.IGNORECASE),
'age': isinstance(age, int) and age >= 18,
'gender': isinstance(gender, str) and gender.lower() in ('male', 'female'),
'diagnosis': isinstance(diagnosis, str) or diagnosis is None,
'medications': isinstance(medications, list)
and all([isinstance(i, str) for i in medications]),
'last_visit_id': isinstance(last_visit_id, str)
and re.fullmatch('v\d+', last_visit_id, re.IGNORECASE)
}
return [key for key, value in constraints.items() if not value]
def validate(data):
is_sequence = isinstance(data, (list, tuple))
if not is_sequence:
print('Invalid format: expected a list or tuple.')
return False
is_invalid = False
key_set = set(
['patient_id', 'age', 'gender', 'diagnosis', 'medications', 'last_visit_id']
)
for index, dictionary in enumerate(data):
if not isinstance(dictionary, dict):
print(f'Invalid format: expected a dictionary at position {index}.')
is_invalid = True
continue
if set(dictionary.keys()) != key_set:
print(
f'Invalid format: {dictionary} at position {index} has missing and/or invalid keys.'
)
is_invalid = True
continue
invalid_records = find_invalid_records(**dictionary)
# User Editable Region
for record in invalid_records:
print(f"Unexpected format '{key}: {value} at position {index}.")
is_invalid = True
# User Editable Region
if is_invalid:
return False
print('Valid format.')
return True
validate(medical_records)
Your browser information:
User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
Challenge Information:
Build a Medical Data Validator - Step 44