Đối với hai phần sau đây 'dictWithListsInValue' và 'reorderedDictWithReorderedListsInValue' chỉ đơn giản là các phiên bản được sắp xếp lại của nhau
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
đã cho tôi kết quả sai tức là sai.
Vì vậy, tôi đã tạo ObjectComparator biểu tượng của riêng mình như thế này:
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
đã cho tôi kết quả mong đợi chính xác!
Logic khá đơn giản:
Nếu các đối tượng thuộc loại 'danh sách' thì hãy so sánh từng mục của danh sách đầu tiên với các mục của danh sách thứ hai cho đến khi tìm thấy và nếu mục không được tìm thấy sau khi xem qua danh sách thứ hai, thì 'tìm thấy' sẽ là = false. giá trị 'tìm thấy' được trả về
Ngược lại, nếu các đối tượng được so sánh thuộc loại 'dict' thì hãy so sánh các giá trị hiện có cho tất cả các khóa tương ứng trong cả hai đối tượng. (So sánh đệ quy được thực hiện)
Khác chỉ cần gọi obj1 == obj2. Theo mặc định, nó hoạt động tốt cho đối tượng là chuỗi và số và đối với những eq () được định nghĩa thích hợp.
(Lưu ý rằng thuật toán có thể được cải thiện hơn nữa bằng cách loại bỏ các mục được tìm thấy trong object2, để mục tiếp theo của object1 sẽ không tự so sánh với các mục đã tìm thấy trong object2)