Step 44 on building a medical records validator

i keep getting a message saying i need to use a for loop to iterate over invalid records which i believe i did so…need help

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)
    for index, invalid_record in enumerate(invalid_records):
        for key, val in invalid_record.items():
            print(f"Unexpected format '<key>: <val>' at position <index>.")
            is_invalid= True

    if is_invalid:
        return False
    print('Valid format.')
    return True

validate(medical_records)

You are looping over enumerate(invalid_records) (and invalid_record.items() ?)

Check your indentation.

Where do your key and val variables come from?

How do you print variables in an f string?

the key and val variables are in an invalid_record which was the name i used for each record within invalid_records hence looping twice and for the enumerate i was thinking about how to show the index variable

i have tried changing the code and using curly brackets for the formatted string…though its now bringing a new message which is print(unexpected format…. which i did…not sure what am missing

What is invalid_records ? Is it a dictionary?

print() it to find out what it contains.

Put some invalid data into medical_records to test your code.

You should review all of the code as well, and familiarize yourself with where you are as far as function and nested loops. What variables are available?

Please provide a link to the step.