Build a Medical Data Validator - Step 44

Tell us what’s happening:

keep receiving the same error “You should have a for loop that iterates over invalid_records.”. none of the solutions available on the forum are successful in running my code. I’ve reset multiple times and checked for punctuation but am unable to continue past this last step :frowning:

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

Challenge Information:

Build a Medical Data Validator - Step 44

GitHub Link: https://github.com/freeCodeCamp/freeCodeCamp/blob/main/curriculum/challenges/english/blocks/workshop-medical-data-validator/68529fb26c581f13e901de3a.md

Hey @samy_questions

Step is expecting :
Unexpected format '<key>: <val>' at position <index>.
but you are providing:
Unexpected format '<key>': <val> at position <index>.

Happy coding!

i don’t know why it showed an older version of the code

Add a whitespace b/w dictonary[key]} and at. Other than that I don’t see an issue but if it still persists, please share your latest code.

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:

    print(f"Unexpected format '{key}: {dictionary\[key\]}' at position {index}.")

    is_invalid = True

if is_invalid:

    return False

print('Valid format.')

return True

validate(medical_records)

I think \ got added while pasting the code but other than that your code is fine so I would suggest to reset this step and write the code again as there are chances of indentation getting messed up somewhere else in the code. You can reset the step by clicking the marked button shown in below image.

image

after retyping it from memory at this point, it finally worked, thanks so much

Congratulations! it happens sometimes but at the end, you passed.

Happy coding!