Build a Medical Data Validator - Step 44

Tell us what’s happening:

I understand from here that I need to pull the values from the medical_records dictionary, but I’m confused on how to structure the line. In this line (value = medical_records.key(invalid_records)), do I somehow reference invalid_records? Any guidance is appreciated.

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, val, index in invalid_records:
            value = medical_records.key(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

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/150.0.0.0 Safari/537.36 Edg/150.0.0.0

Challenge Information:

Build a Medical Data Validator - Step 44

GitHub Link: freeCodeCamp/curriculum/challenges/english/blocks/workshop-medical-data-validator/68529fb26c581f13e901de3a.md at main · freeCodeCamp/freeCodeCamp · GitHub

look around, you are inside this loop, aren’t you?

so you already have available certain values here

are you sure you have all these things available in invalid_records?

you created it earlier, what does invalid_records return?

you can also add print(invalid_records) right above the loop, and change some values in the global object to be invalid, so you can see how invalid_records looks

Thanks for the feedback. Invalid_records returns keys if invalid, and I understand that for value to be included I would need to define Val as the output of the function invalid_records with a key input. However, I’m not sure how to approach this from a dictionary.

val = medical_records(invalid_records(key))

^This is the logic I’m trying to implement, but I may be misunderstanding the system. Thanks

no, you don’t want this logic

medical_records is an object, not a function
while invalid_records is a list and not a function

invalid_records is created here:

invalid_records is storing the list of the properties that do not pass validation, and you need to communicate that by printing each invalid property to the terminal

Look again at your outer loop variables. How do you get the value from a dictionary using the key?

Hi. I’m seeing the outer loop variables, but even drwaying from the dictionary with " val = dictionary.keys()" like earlier, I am running into the same issue. Do I need to define key (because that’s not a variable in the outer loop??

You have the key from your inner loop, right? You’re on the right track to get val, but your syntax is off.

I’m seeing that it returns all of the dictionary keys, but I need to somehow specify that it should only print the in_valid one. Earlier I used “key for key, value in constraints.items() if not value”. Altering this is to “val for val in dictionary.keys() if not valuekey” and plugging in as {key below} isn’t working either.

Your syntax is still wrong for getting the value of a dictionary key.

Please refer to this theory lecture again:
Working with Dictionaries and Sets - What Are Dictionaries, and How Do They Work? | Learn | freeCodeCamp.org

Excerpts from that:

To access the value of a key-value pair, you can use this syntax, known as bracket notation. It’s the name of the variable that holds the dictionary, followed by square brackets, and the key you want to access within the square brackets:

dictionary[key]

You’re using the key() method instead:

The .keys() and .values() methods return a view object with all the keys and values in the dictionary, respectively:

pizza.keys()
# dict_keys(['name', 'price', 'calories_per_slice'])

pizza.values()
# dict_values(['Margherita Pizza', 8.9, 250])

did you make any changes to medical_records or to find_invalid_records?

in invalid_records you should find the keys that have invalid values only