Finding the difference in values of matching keys in two dictonaries in python3

Question:

So I have two dictionaries that store specific "channels" and their values, these channels update every second. My end goal is to create a tool/GUI that will help us determine how off or misaligned our channels are, they correspond to optical mount DOFs.

I currently have a function that grabs the current time and determines the channels value at that time and puts it in a dictionary and another function that lets you select a time and then does the same.

The part of this project I’m a bit lost on is how to compare these dictionaries.

I want to match the keys (which are my channels) and then find the difference between their two values and store that in a 3rd dictionary with the same channels.

So here’s the basic idea in code for what I’m looking to do:

diff_channels_dict = {}
### After my functions that create these dictionaries run, I'll have something like the following, but a lot longer

ref_channels_dict = {

    'IM1_M1_P_OFFSET': 8,
    'IM1_M1_Y_OFFSET': 8,
    'IM2_M1_P_OFFSET': 8}
now_channels_dict = {

    'IM1_M1_P_OFFSET': 2,
    'IM1_M1_Y_OFFSET': 2,
    'IM2_M1_P_OFFSET': 2}


def some_func():

    for key in now_channels_dict and ref_channels_dict:
        diff = now_channels_dict[value] - ref_channels_dict[value]
        diff_channels_dict[key].append(diff)
    return

some_func()

### So then
diff_channels_dict = {

    'IM1_M1_P_OFFSET': -6,
    'IM1_M1_Y_OFFSET': -6,
    'IM2_M1_P_OFFSET': -6}

Can anyone give me some guidance on how to go about doing this? I looked into a few libraries, deepdiff, and Dictdiffer but I do not have access to them with the env that is used on all the machines that will use this tool.

Asked By: ryancrouch

||

Answers:

I’m going to assume that the starting dictionaries are like this (written in python format):

ref_channels_dict = {
            'IM1_M1_P_OFFSET': 8,
            'IM1_M1_Y_OFFSET': 8,
            'IM2_M1_P_OFFSET': 8
            }
            
now_channels_dict = {
            'IM1_M1_P_OFFSET': 2,
            'IM1_M1_Y_OFFSET': 2,
            'IM2_M1_P_OFFSET': 2
            }

From this, we can write the function that compares and put the differences into a new dictionary:

def compare_dictionaries(ref_dict, now_dict):
    assert ref_dict.keys() == now_dict.keys() # check if the keys are the same

    diff_dict = {}

    for key in ref_dict.keys(): #iterate over the keys and fill the diff_dict with the differences
        # this can be done because we know that the keys in both dictionaries are the same
        diff_dict[key] = now_dict[key] - ref_dict[key]

    return diff_dict

After that, we can define the whole code as:


def compare_dictionaries(ref_dict, now_dict):
    assert ref_dict.keys() == now_dict.keys() # check if the keys are the same

    diff_dict = {}

    for key in ref_dict.keys(): #iterate over the keys and fill the diff_dict with the differences
        # this can be done because we know that the keys in both dictionaries are the same
        diff_dict[key] = now_dict[key] - ref_dict[key]

    return diff_dict





if __name__ == "__main__":
    ref_channels_dict = {
            'IM1_M1_P_OFFSET': 8,
            'IM1_M1_Y_OFFSET': 8,
            'IM2_M1_P_OFFSET': 8
            }

    now_channels_dict = {
            'IM1_M1_P_OFFSET': 2,
            'IM1_M1_Y_OFFSET': 2,
            'IM2_M1_P_OFFSET': 2
            }

    print(compare_dictionaries(ref_channels_dict, now_channels_dict))

Which outputs:

>>> {'IM1_M1_P_OFFSET': -6, 'IM1_M1_Y_OFFSET': -6, 'IM2_M1_P_OFFSET': -6}
Answered By: Cuartero

with pandas you can do it without looping, what could be quite useful for really large dataset:

import pandas as pd

diff_dict = (pd.Series(now_channels_dict) - pd.Series(ref_channels_dict)).to_dict()

print(diff_dict)  
'''
{'IM1_M1_P_OFFSET': -6, 'IM1_M1_Y_OFFSET': -6, 'IM2_M1_P_OFFSET': -6}
Answered By: SergFSM