เนื่องจากดูเหมือนว่าไม่มีใครพูดถึง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
}
}
}
หมายเหตุเกี่ยวกับการพิมพ์ผลลัพธ์สำหรับการตรวจสอบอย่างสวยหรู: โค้ดด้านบนใช้งานได้ถ้า dicts ทั้งคู่มีคีย์แอ็ตทริบิวต์ที่เหมือนกัน อย่างไรก็ตามหากมี"extra"
แอตทริบิวต์เป็นหนึ่งใน dicts 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
# same code as above
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
ควรเป็นจริงตามstackoverflow.com/a/5635309/186202