Build a Medical Data Validator - Step 44

Tell us what’s happening:

i am unable to finish step 44
import re

medical_records = [
{
‘patient_id’: ‘P1001’,
‘age’: 34,
‘gender’: ‘Fhh’,
‘diagnosis’: ‘Hypertension’,
‘medications’: [‘Lisinopril’],
‘last_visit_id’: ‘V2301’,
},
{
‘patient_id’: ‘p1002’,
‘age’: 47,
‘gender’: ‘xyz’,
‘diagnosis’: ‘Type 2 Diabetes’,
‘medications’: [‘Metformin’, ‘Insulin’],
‘last_visit_id’: ‘v2302’,
},
{
‘patient_id’: ’

Your code so far


# User Editable Region

import re


medical_records = [
    {
        'patient_id': 'P1001',
        'age': 34,
        'gender': 'Fhh',
        'diagnosis': 'Hypertension',
        'medications': ['Lisinopril'],
        'last_visit_id': 'V2301',
    },
    {
        'patient_id': 'p1002',
        'age': 47,
        'gender': 'xyz',
        '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 pos,key in enumerate(invalid_records):
            val=dictionary[key]
            print(f'Unexpected format {key} : {val} at position {index}')  
            is_invalid=True
        if is_invalid:
          
          return False
    pass
    print('Valid format')
    return True
        

validate(medical_records)




# User Editable Region

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 are you using pos? Why do you need pos? Based on the message you are printing, what values do you need?

1 Like

i have seen this in one of the post

Remember that when you copy code from forum posts, you’re also copying the errors.

for no, key in invalid_records:

        val=dictionary\[key\]

        print(f'Unexpected format {key} : {val} at position {index}')  

        is_invalid=True

but i am getting error You should have a for loop that iterates over invalid_records.

What is no being used for?

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

i am getting this error -You should have a for loop that iterates over invalid_records.

Please post your full updated code so I can test.

Did you fix indentation errors in this block of code from your initial post?

import re




medical_records = \[

    {

        'patient_id': 'P1001',

        'age': 34,

        'gender': 'Fhh',

        'diagnosis': 'Hypertension',

        'medications': \['Lisinopril'\],

        'last_visit_id': 'V2301',

    },

    {

        'patient_id': 'p1002',

        'age': 47,

        'gender': 'xyz',

        '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

    pass

    print('Valid format')

    return True

        



validate(medical_records)

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 (').

Instructions do not ask you to write pass anywhere.

I don’t get the same error. Are you sure you’re getting this error?

When I test your code I get this error:

  1. You should print Unexpected format '<key>: <val>' at position <index>.

Check the spacing and punctuation of this line.

You’re on the right track

checked still getting same error

You should print Unexpected format '<key>: <val>' at position <index>. (where <key>, <val>, and <index> should be replaced by the current key, value and index) inside your for loop.

help

Check it again.

Please share your updated code.