dictionary – How to get the difference between two dictionaries in Python?

dictionary – How to get the difference between two dictionaries in Python?

I think its better to use the symmetric difference operation of sets to do that Here is the link to the doc.

>>> dict1 = {1:donkey, 2:chicken, 3:dog}
>>> dict2 = {1:donkey, 2:chimpansee, 4:chicken}
>>> set1 = set(dict1.items())
>>> set2 = set(dict2.items())
>>> set1 ^ set2
{(2, chimpansee), (4, chicken), (2, chicken), (3, dog)}

It is symmetric because:

>>> set2 ^ set1
{(2, chimpansee), (4, chicken), (2, chicken), (3, dog)}

This is not the case when using the difference operator.

>>> set1 - set2
{(2, chicken), (3, dog)}
>>> set2 - set1
{(2, chimpansee), (4, chicken)}

However it may not be a good idea to convert the resulting set to a dictionary because you may lose information:

>>> dict(set1 ^ set2)
{2: chicken, 3: dog, 4: chicken}

Try the following snippet, using a dictionary comprehension:

value = { k : second_dict[k] for k in set(second_dict) - set(first_dict) }

In the above code we find the difference of the keys and then rebuild a dict taking the corresponding values.

dictionary – How to get the difference between two dictionaries in Python?

Another solution would be dictdiffer (https://github.com/inveniosoftware/dictdiffer).

import dictdiffer                                          

a_dict = {                                                 
  a: foo,
  b: bar,
  d: barfoo
}                                                          

b_dict = {                                                 
  a: foo,                                              
  b: BAR,
  c: foobar
}                                                          

for diff in list(dictdiffer.diff(a_dict, b_dict)):         
    print diff

A diff is a tuple with the type of change, the changed value, and the path to the entry.

(change, b, (bar, BAR))
(add, , [(c, foobar)])
(remove, , [(d, barfoo)])

Leave a Reply

Your email address will not be published. Required fields are marked *