compare structure and key names of two dictionaries, not values

Question:

Let’s say I have two dictionaries like this:

dict_1 = {
    "key_1": {
        "key_1_1": "test",
        "key_1_2": "test",
        "key_1_3": "test",
        "key_1_4": [
            {
                "key": "test",
                "value": "test_value"
            },
            {
                "key": "test",
                "value": "test_value"
            }
        ]
    }
}

dict_2 = {
    "key_1": {
        "key_1_1": "test1",
        "key_1_2": "test1",
        "key_1_3": "test1",
        "key_1_4": [
            {
                "key": "test1",
                "value": "test_value1"
            },
            {
                "key": "test1",
                "value": "test_value1"
            }
        ]
    }
}

Is there a way that I can compare these two dictionaries and return either True or False.
I have tried:

dict_1 == dict2

and also deepdiff but it is returning differences in values. In my case, dictionary structure are the same, also key names are the same and it should return me True. I don’t care about the values

Asked By: user14073111

||

Answers:

You could create a function that replaces all scalar values in your object with a dummy value, such as None.

dict_1 = {
    "key_1": {
        "key_1_1": "test",
        "key_1_2": "test",
        "key_1_3": "test",
        "key_1_4": [
            {
                "key": "test",
                "value": "test_value"
            },
            {
                "key": "test",
                "value": "test_value"
            }
        ]
    }
}

dict_2 = {
    "key_1": {
        "key_1_1": "test1",
        "key_1_2": "test1",
        "key_1_3": "test1",
        "key_1_4": [
            {
                "key": "test1",
                "value": "test_value1"
            },
            {
                "key": "test1",
                "value": "test_value1"
            }
        ]
    }
}

def just_keys(obj):
    if isinstance(obj, dict):
        return {k: just_keys(v) for k,v in obj.items()}
    elif isinstance(obj, list):
        return [just_keys(item) for item in obj]
    else:
        return None

def keys_equal(a,b):
    return just_keys(a) == just_keys(b)


print(just_keys(dict_1))
print(just_keys(dict_2))
print(keys_equal(dict_1, dict_2))

Result:

{'key_1': {'key_1_1': None, 'key_1_2': None, 'key_1_3': None, 'key_1_4': [{'key': None, 'value': None}, {'key': None, 'value': None}]}}
{'key_1': {'key_1_1': None, 'key_1_2': None, 'key_1_3': None, 'key_1_4': [{'key': None, 'value': None}, {'key': None, 'value': None}]}}
True
Answered By: Kevin
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.