নিম্নলিখিত দুটি ডিক্টের জন্য 'ডিকুইডলিস্টআইনওয়ালিউ' এবং 'রিকর্ডারডডিক্ট উইথরর্ডারডলিস্টআইনওয়ালু' যা একে অপরের কেবল পুনরায় সাজানো সংস্করণ
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()))
আমাকে ভুল ফল দিয়েছে, মিথ্যা।
সুতরাং আমি এইভাবে আমার নিজস্ব চটসটম অবজেক্ট কমপারেটর তৈরি করেছি:
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):
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))
যা আমাকে সঠিক প্রত্যাশিত আউটপুট দিয়েছে!
যুক্তি বেশ সহজ:
যদি অবজেক্টগুলি 'তালিকা' টাইপ করে থাকে তবে প্রথম তালিকার প্রতিটি আইটেমটি দ্বিতীয় তালিকার আইটেমগুলির সাথে না পাওয়া পর্যন্ত তুলনা করুন এবং যদি দ্বিতীয় তালিকার মধ্য দিয়ে আইটেমটি পাওয়া যায় না, তবে 'পাওয়া' = মিথ্যা হবে। 'পাওয়া' মানটি ফিরে আসে
অন্যথায় যদি তুলনামূলকভাবে অবজেক্টগুলি 'ডিক' টাইপের হয় তবে উভয় বস্তুর মধ্যে সমস্ত সম্পর্কিত কীগুলির জন্য উপস্থিত মানগুলির তুলনা করুন। (পুনরাবৃত্ত তুলনা সম্পাদন করা হয়)
অন্যথায় কেবল اعتراض 1 == اعتراض2 কল করুন। এটি ডিফল্টরূপে স্ট্রিং এবং সংখ্যার অবজেক্টের জন্য সূক্ষ্মভাবে কাজ করে এবং যারা EQ () যথাযথভাবে সংজ্ঞায়িত করা হয়।
(দ্রষ্টব্য যে অবজেক্ট 2-তে পাওয়া আইটেমগুলি সরিয়ে অ্যালগরিদম আরও উন্নত করা যেতে পারে, যাতে অবজেক্ট 1 এর পরবর্তী আইটেমটি ইতিমধ্যে 2 বস্তুর মধ্যে পাওয়া আইটেমগুলির সাথে নিজেকে তুলনা না করে)