Last active
October 31, 2017 14:44
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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): | |
... |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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