Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference in a dict

I'm trying to figure out the difference in a dict, whether something was added or removed and from what.

Here is a case where a value is added:

original = {0: None, 1: False, 2: [16]}
new = {0: None, 1: False, 2: [2, 16]}

difference = True, {2: 2} # True = Added

And here is a case where a value is removed:

original = {0: None, 1: False, 2: [16, 64]}
new = {0: None, 1: False, 2: [64]}

difference = False, {2: 16} # False = Removed

The problem is that I have no idea how to recieve the difference. Would anyone happen to know how to achieve such a result?

Extra information (no idea if you'll need this):

  • This can apply to 0 and 1 of original and new as well.
  • 1 and 2 cannot be active at the same time. If one has values, the other is False.
like image 286
dbdii407 Avatar asked Jul 09 '11 02:07

dbdii407


People also ask

How do I tell the difference between a dictionary in Python?

With set. Here we take two dictionaries and apply set function to them. Then we subtract the two sets to get the difference. We do it both ways, by subtracting second dictionary from first and next subtracting first dictionary form second.

How do I compare dict keys?

The compare method cmp() is used in Python to compare values and keys of two dictionaries. If method returns 0 if both dictionaries are equal, 1 if dic1 > dict2 and -1 if dict1 < dict2.

How do you compare two dictionaries in Python?

For simple dictionaries, comparing them is usually straightforward. You can use the == operator, and it will work.


4 Answers

As I've explained in an other question there is a library on PyPI just for this task, which is datadiff library. It's easy to use and you can use the output to do what you have to do.

like image 70
softwareplay Avatar answered Oct 22 '22 04:10

softwareplay


I find this quite readable:

def dict_diff(left, right):
    diff = dict()
    diff['left_only'] = set(left) - set(right)
    diff['right_only'] = set(right) - set(left)
    diff['different'] = {k for k in set(left) & set(right) if left[k]!=right[k]}
    return diff

>>> d1 = dict(a=1, b=20, c=30, e=50)
>>> d2 = dict(a=1, b=200, d=400, e=500)
>>> dict_diff(d1, d2)
{'different': {'b', 'e'}, 'left_only': {'c'}, 'right_only': {'d'}}
like image 32
snth Avatar answered Oct 22 '22 05:10

snth


Here is a link to a function that can produce a "diff" of two dictionaries, followed by additional comments/code samples:

http://code.activestate.com/recipes/576644-diff-two-dictionaries/

Including code below:

KEYNOTFOUND = '<KEYNOTFOUND>'       # KeyNotFound for dictDiff

def dict_diff(first, second):
    """ Return a dict of keys that differ with another config object.  If a value is
        not found in one fo the configs, it will be represented by KEYNOTFOUND.
        @param first:   Fist dictionary to diff.
        @param second:  Second dicationary to diff.
        @return diff:   Dict of Key => (first.val, second.val)
    """
    diff = {}
    # Check all keys in first dict
    for key in first.keys():
        if (not second.has_key(key)):
            diff[key] = (first[key], KEYNOTFOUND)
        elif (first[key] != second[key]):
            diff[key] = (first[key], second[key])
    # Check all keys in second dict to find missing
    for key in second.keys():
        if (not first.has_key(key)):
            diff[key] = (KEYNOTFOUND, second[key])
    return diff
like image 43
AJ. Avatar answered Oct 22 '22 03:10

AJ.


you may temporarily transfer dic[2] to a set in python, and use - to get the difference

like image 42
taijirobot Avatar answered Oct 22 '22 04:10

taijirobot