Build a Medical Data Validator - Step 44

Tell us what’s happening:

Believe my code is accurate but it’s seemingly not happy with the fstring i’m printing, have checked the spacing and punctuation so not sure what the issue is - pls help

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 i, j in invalid_records:
            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

print(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/143.0.0.0 Safari/537.36

Challenge Information:

Build a Medical Data Validator - Step 44

Where do the key and val variables come from?

Change the data in medical_records to be invalid to test.

1 Like

sorry but i’m not sure i understand your question - why does index work in this context but key and val don’t? i’ve tried replacing {key} and {val} with the iteration variables in the for loop and other kinds of wordings but no dice

Review all of the code you’ve written so far to get a better understanding of it.

Look for where the index variable is created.

1 Like

index works because you are already inside a loop: for index, dictionary in enumerate(data):

key and val don’t work because they are not defined in your loop.

1 Like

still struggling after reviewing the code and steps, when I go to change the values in one of the dictionaries to test e.g. from a string to an int, it returns ‘Value Error: too many values to unpack (expected 2). Attempted to use key and val for the iteration variables in the final for loop - didn’t work. I’m not sure I understand the unpacking of dictionary part, as I believed this unpacked the keys and values into a list and assigned them each new separate variables, and am unsure on how that works with two different iteration variables in the for loop to try to access both key and value? also tried making invalid_records into a dictionary and iterating over invalid_records.items() but this isn’t permitted as you can only iterate over invalid_records

what kind of data structure is invalid_records? have checked that?

1 Like

How did you do this? If it was supposed to be a dictionary it would be in the instructions. It seems you know that invalid_records is n a dictionary. What is it?

Did you identify the line of code where index is created?

Next identify the line of code where invalid_records is created.

Try to print() invalid_records to see the contents.

1 Like

Confirmed invalid_records was a list via type() and changed the for loop so it had one iteration variable (key), then just had to figure out the correct way to access the value with an expression which took a while but got there! thanks guys, appreciate the help

1 Like