Karena sepertinya tidak ada yang disebutkan deepdiff
, saya akan menambahkannya di sini untuk kelengkapan. Saya merasa sangat nyaman untuk mendapatkan objek yang berbeda (bersarang) secara umum:
Instalasi
pip install deepdiff
Kode sampel
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))
Keluaran
{
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
Catatan tentang pencetakan cantik hasil untuk pemeriksaan: Kode di atas berfungsi jika kedua dikte memiliki kunci atribut yang sama (dengan nilai atribut yang mungkin berbeda seperti pada contoh). Namun, jika suatu "extra"
atribut hadir adalah salah satu dicts, json.dumps()
gagal dengan
TypeError: Object of type PrettyOrderedSet is not JSON serializable
Solusi: gunakan diff.to_json()
dan json.loads()
/ json.dumps()
untuk mencetak-cantik:
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))
Keluaran:
{
"dictionary_item_removed": [
"root['extra']"
],
"values_changed": {
"root['a']": {
"new_value": 2,
"old_value": 1
},
"root['nested']['b']": {
"new_value": 2,
"old_value": 1
}
}
}
Alternatif: gunakan pprint
, menghasilkan pemformatan yang berbeda:
import pprint
# same code as above
pprint.pprint(diff, indent=4)
Keluaran:
{ '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
harus benar sesuai dengan stackoverflow.com/a/5635309/186202