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):
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.
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.
For simple dictionaries, comparing them is usually straightforward. You can use the == operator, and it will work.
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.
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'}}
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
you may temporarily transfer dic[2] to a set
in python, and use -
to get the difference
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With