# Python – Calculate difference in keys contained in two Python dictionaries

dictionarypython

Suppose I have two Python dictionaries – `dictA` and `dictB`. I need to find out if there are any keys which are present in `dictB` but not in `dictA`. What is the fastest way to go about it?

Should I convert the dictionary keys into a set and then go about?

Apologies for not stating my question properly.
My scenario is like this – I have a `dictA` which can be the same as `dictB` or may have some keys missing as compared to `dictB` or else the value of some keys might be different which has to be set to that of `dictA` key's value.

Problem is the dictionary has no standard and can have values which can be dict of dict.

Say

``````dictA={'key1':a, 'key2':b, 'key3':{'key11':cc, 'key12':dd}, 'key4':{'key111':{....}}}
dictB={'key1':a, 'key2:':newb, 'key3':{'key11':cc, 'key12':newdd, 'key13':ee}.......
``````

So 'key2' value has to be reset to the new value and 'key13' has to be added inside the dict.
The key value does not have a fixed format. It can be a simple value or a dict or a dict of dict.

#### Best Solution

You can use set operations on the keys:

``````diff = set(dictb.keys()) - set(dicta.keys())
``````

Here is a class to find all the possibilities: what was added, what was removed, which key-value pairs are the same, and which key-value pairs are changed.

``````class DictDiffer(object):
"""
Calculate the difference between two dictionaries as:
(2) items removed
(3) keys same in both but changed values
(4) keys same in both and unchanged values
"""
def __init__(self, current_dict, past_dict):
self.current_dict, self.past_dict = current_dict, past_dict
self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys())
self.intersect = self.set_current.intersection(self.set_past)
return self.set_current - self.intersect
def removed(self):
return self.set_past - self.intersect
def changed(self):
return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o])
def unchanged(self):
return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])
``````

Here is some sample output:

``````>>> a = {'a': 1, 'b': 1, 'c': 0}
>>> b = {'a': 1, 'b': 2, 'd': 0}
>>> d = DictDiffer(b, a)