Build a Medical Data Validator - Step 44

Tell us what’s happening:

I am not sure what i am doing wrong here because the terminal is not saying anything is wrong I have looked over it but i must be missing something.

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 invalid_records in invalid_records:
            val=dictionary[key]
            print(f'Unexpected format {key}:{val} 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/145.0.0.0 Safari/537.36

Challenge Information:

Build a Medical Data Validator - Step 44

Welcome to the forum @hardaway3315!

Where is key coming from?

Happy coding!

There are three bugs in your User Editable Region:

Bug 1 Loop variable shadows the list it’s iterating over:

The loop variable has the same name as the list it’s iterating over, which overwrites invalid_records on every iteration and breaks the loop. Rename the loop variable to key (since each item is a field name):

# ❌
for invalid_records in invalid_records:

# ✅
for key in invalid_records:

Bug 2 key is referenced before it exists:

Inside the loop you use dictionary[key], but key was never defined because of Bug 1. Once you fix the loop variable name to key, this line works on its own.

Bug 3 is_invalid = True is outside the loop:

# ❌ This runs for every record, even valid ones
for invalid_records in invalid_records:
    val = dictionary[key]
    print(f'Unexpected format {key}:{val} at position {index}.')
is_invalid = True

Indent it one level so it only triggers when an invalid field is actually found.

Corrected block:

for key in invalid_records:
            val = dictionary[key]
            print(f'Unexpected format {key}:{val} at position {index}.')
            is_invalid = True

The reason your terminal wasn’t complaining is that none of these are syntax errors they’re logic/runtime bugs that only surface when the code actually executes.

Happy coding!

Thanks that was a very thorough explanation. I tried many variations and was so lost. I appreciate your guidance.