字典中的差异
我想弄明白一个字典(dict)里的差别,想知道是添加了什么,还是移除了什么,以及是从哪里来的。
这里有一个值被添加的例子:
original = {0: None, 1: False, 2: [16]}
new = {0: None, 1: False, 2: [2, 16]}
difference = True, {2: 2} # True = Added
这里有一个值被移除的例子:
original = {0: None, 1: False, 2: [16, 64]}
new = {0: None, 1: False, 2: [64]}
difference = False, {2: 16} # False = Removed
问题是我不知道怎么去获取这些差别。有没有人知道怎么才能做到这一点?
额外信息(不知道你们需不需要这些):
- 这也可以适用于原始数据和新数据都是0或1的情况。
- 1和2不能同时激活。如果一个有值,另一个就是False。
6 个回答
2
这里有一个链接,里面有一个可以比较两个字典(也就是一组键值对)差异的函数,后面还有一些额外的评论和代码示例:
http://code.activestate.com/recipes/576644-diff-two-dictionaries/
下面是代码:
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
3
我觉得这个代码挺容易理解的:
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'}}