निम्नलिखित दो dicts 'dictWithListsInValue' और 'reorderedDictWithReorderedListsInValue' के लिए, जो केवल एक दूसरे के पुन: क्रमबद्ध संस्करण हैं
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
मुझे गलत परिणाम दिया अर्थात असत्य।
तो मैंने इस तरह से अपना खुद का cutstom ObjectComparator बनाया:
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
जो मुझे सही उम्मीद आउटपुट दिया!
तर्क बहुत सरल है:
यदि ऑब्जेक्ट टाइप 'सूची' के हैं, तो पहली सूची के प्रत्येक आइटम की दूसरी सूची के आइटमों से तुलना करें जब तक कि पाया नहीं जाता है, और यदि आइटम दूसरी सूची से गुजरने के बाद नहीं मिला है, तो 'पाया' = गलत होगा। 'पाया' मान लौटा है
और यदि वस्तुओं की तुलना की जाए तो वे 'प्रकार' हैं, तो दोनों वस्तुओं में सभी संबंधित कुंजियों के लिए मौजूद मानों की तुलना करें। (पुनरावर्ती तुलना की जाती है)
और केवल बस obj1 == obj2 पर कॉल करें। यह डिफ़ॉल्ट रूप से स्ट्रिंग्स और संख्याओं की वस्तु के लिए ठीक काम करता है और उन eq () के लिए उचित रूप से परिभाषित किया गया है।
(ध्यान दें कि ऑब्जेक्ट 2 में पाई गई वस्तुओं को हटाकर एल्गोरिथ्म को और बेहतर बनाया जा सकता है, ताकि ऑब्जेक्ट 1 के अगले आइटम ऑब्जेक्ट 2 में पहले से मौजूद वस्तुओं के साथ खुद की तुलना न करें)