由于似乎没有人提到 deepdiff
,我将其添加到这里以便完整性。我发现它非常方便,可用于获取(嵌套)对象的差异:
安装
pip install deepdiff
样例代码
import deepdiff
import json
dict_1 = {
"a": 1,
"nested": {
"b": 1,
}
}
dict_2 = {
"a": 2,
"nested": {
"b": 2,
}
}
diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(diff, indent=4))
输出
{
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
关于漂亮地打印结果以便查看的说明:上述代码适用于两个字典具有相同属性键(例如示例中一样,可能存在不同的属性值)的情况。但是,如果其中一个字典存在额外的"extra"属性,则
json.dumps()
会失败。
TypeError: Object of type PrettyOrderedSet is not JSON serializable
解决方案:使用diff.to_json()
和json.loads()
/ json.dumps()
进行漂亮打印:
import deepdiff
import json
dict_1 = {
"a": 1,
"nested": {
"b": 1,
},
"extra": 3
}
dict_2 = {
"a": 2,
"nested": {
"b": 2,
}
}
diff = deepdiff.DeepDiff(dict_1, dict_2)
print(json.dumps(json.loads(diff.to_json()), indent=4))
输出:
{
"dictionary_item_removed": [
"root['extra']"
],
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
另一种选择:使用pprint
,可以得到不同的格式:
import pprint
pprint.pprint(diff, indent=4)
输出:
{ 'dictionary_item_removed': [root['extra']],
'values_changed': { "root['a']": { 'new_value': 2,
'old_value': 1},
"root['nested']['b']": { 'new_value': 2,
'old_value': 1}}}
x == y
应该为真:“字典只有在它们具有相同的(键,值)对(无论顺序如何)时才相等。顺序比较(‘<’,‘<=’,‘>=’,‘>’)会引发TypeError错误。” - MestreLion