Build a Medical Data Validator - Step 44

Tell us what’s happening:

Hi there,
I have trouble understanding why my code is not accepted.
I tested several inserted mistakes in age, gender etc. and got console replies with indices from 0-3. Also matching when multiple errors where present.
The typo should be similar to expectations.
Also is_invalid=True is there.
What am I missing?
Thanks in advance

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
        

# User Editable Region

    is_invalid = False
    key_set = set(
        ['patient_id', 'age', 'gender', 'diagnosis', 'medications', 'last_visit_id']
    )

    for index, dictionary in enumerate(data):

# User Editable Region

        if not isinstance(dictionary, dict):
            print(f'Invalid format: expected a dictionary at position {index}.')
            is_invalid = True

        if set(dictionary.keys()) != key_set:
            print(
                f'Invalid format: {dictionary} at position {index} has missing and/or invalid keys.'
            )
            is_invalid = True

        invalid_records = find_invalid_records(**dictionary)
        for key in invalid_records:
            val=dictionary[key]
            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)

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0

Challenge Information:

Build a Medical Data Validator - Step 44

Welcome to the forum @nikskiaway

Here is a comparison of the original code and your code.

The code in blue is the original code, the code in red is your code.
The code in magenta is the overlap.

Your code is missing the continue keyword.

Try placing single quote marks inside the string.

Happy coding

Thanks a lot for the suggestions, unfortunately this did not solve it :frowning:

post your updated code please

Sure:


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 key in invalid_records:

            val=dictionary\[key\]

            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)

Sorry, this does not look very nice. Is there a better option than to just Copy/Paste into the comment?

I’ve edited your post to improve the readability of the code. When you enter a code block into a forum post, please precede it with three backticks to make it easier to read.

You can also use the “preformatted text” tool in the editor (</>) to add the backticks.

See this post to find the backtick on your keyboard.
Note: Backticks (`) are not single quotes (').

1 Like

Looks great. Double check the punctuation used in the string you are to print.