Skip to content

Instantly share code, notes, and snippets.

@pykong
Last active October 31, 2017 14:44
Show Gist options
  • Save pykong/d92cbeff466a60f813041db18ee13cb1 to your computer and use it in GitHub Desktop.
Save pykong/d92cbeff466a60f813041db18ee13cb1 to your computer and use it in GitHub Desktop.
Get all added, deleted or modified keys. DictDelata implements this in a stateful fashion.
class DictDelta:
'''Returns a list of ḱeys, which are added, deleted or whose values have been altered compared to the dict passed in the previous call.'''
def __init__(self):
self.old_dict = None
def __call__(self, new_dict):
"""Returns list of changed keys."""
# explicitly check for None, prevent all keys being returned on 1st run
if self.old_dict is None:
self.old_dict = new_dict
return []
changeset = self.diff_keys(new_dict, self.old_dict)
self.old_dict = new_dict
return changeset
def diff_keys(self, d1, d2):
...
def diff_keys(d1, d2):
"""Diff dicts via set operations and subsequent traversing value comparison.
"""
changed_keys = []
d1_keys = set(d1.keys())
d2_keys = set(d2.keys())
sym_diff = list(d1_keys ^ d2_keys)
changed_keys.extend(sym_diff)
intersec = d1_keys & d2_keys
for k in intersec:
if type(d1[k]) is dict:
changed_keys.extend(self.diff_keys(d1[k], d2[k]))
elif d1[k] != d2[k]:
changed_keys.append(k)
return changed_keys
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment