Untuk dua dicts berikut 'dictWithListsInValue' dan 'reorderedDictWithReorderedListsInValue' yang merupakan versi yang disusun ulang satu sama lain
dictObj = {"foo": "bar", "john": "doe"}
reorderedDictObj = {"john": "doe", "foo": "bar"}
dictObj2 = {"abc": "def"}
dictWithListsInValue = {'A': [{'X': [dictObj2, dictObj]}, {'Y': 2}], 'B': dictObj2}
reorderedDictWithReorderedListsInValue = {'B': dictObj2, 'A': [{'Y': 2}, {'X': [reorderedDictObj, dictObj2]}]}
a = {"L": "M", "N": dictWithListsInValue}
b = {"L": "M", "N": reorderedDictWithReorderedListsInValue}
print(sorted(a.items()) == sorted(b.items())) # gives false
memberi saya hasil yang salah yaitu salah.
Jadi saya membuat ObjectComparator cutstom saya sendiri seperti ini:
def my_list_cmp(list1, list2):
if (list1.__len__() != list2.__len__()):
return False
for l in list1:
found = False
for m in list2:
res = my_obj_cmp(l, m)
if (res):
found = True
break
if (not found):
return False
return True
def my_obj_cmp(obj1, obj2):
if isinstance(obj1, list):
if (not isinstance(obj2, list)):
return False
return my_list_cmp(obj1, obj2)
elif (isinstance(obj1, dict)):
if (not isinstance(obj2, dict)):
return False
exp = set(obj2.keys()) == set(obj1.keys())
if (not exp):
# print(obj1.keys(), obj2.keys())
return False
for k in obj1.keys():
val1 = obj1.get(k)
val2 = obj2.get(k)
if isinstance(val1, list):
if (not my_list_cmp(val1, val2)):
return False
elif isinstance(val1, dict):
if (not my_obj_cmp(val1, val2)):
return False
else:
if val2 != val1:
return False
else:
return obj1 == obj2
return True
dictObj = {"foo": "bar", "john": "doe"}
reorderedDictObj = {"john": "doe", "foo": "bar"}
dictObj2 = {"abc": "def"}
dictWithListsInValue = {'A': [{'X': [dictObj2, dictObj]}, {'Y': 2}], 'B': dictObj2}
reorderedDictWithReorderedListsInValue = {'B': dictObj2, 'A': [{'Y': 2}, {'X': [reorderedDictObj, dictObj2]}]}
a = {"L": "M", "N": dictWithListsInValue}
b = {"L": "M", "N": reorderedDictWithReorderedListsInValue}
print(my_obj_cmp(a, b)) # gives true
yang memberi saya hasil yang diharapkan benar!
Logikanya cukup sederhana:
Jika objek bertipe 'list' maka bandingkan setiap item dari list pertama dengan item dari list kedua hingga ditemukan, dan jika item tersebut tidak ditemukan setelah melalui list kedua, maka 'found' akan menjadi = false. nilai 'ditemukan' dikembalikan
Lain jika objek yang akan dibandingkan adalah tipe 'dict' kemudian bandingkan nilai-nilai yang ada untuk semua kunci masing-masing di kedua objek. (Perbandingan rekursif dilakukan)
Lain cukup panggil obj1 == obj2. Ini secara default berfungsi dengan baik untuk objek string dan angka dan untuk eq () itu didefinisikan dengan tepat.
(Perhatikan bahwa algoritme selanjutnya dapat ditingkatkan dengan menghapus item yang ditemukan di objek2, sehingga item objek1 berikutnya tidak akan membandingkan dirinya sendiri dengan item yang sudah ditemukan di objek2)