আপনি dictঅন্যের চাবি হিসাবে dictবা এ- তে ব্যবহার করার চেষ্টা করছেন set। এটি কার্যকর হয় না কারণ কীগুলি হ্যাশেবল হতে হবে। একটি সাধারণ নিয়ম হিসাবে, কেবলমাত্র অপরিবর্তনীয় অবজেক্ট (স্ট্রিং, ইন্টিজার্স, ফ্লোটস, ফ্রোজেনসেটস, অপরিশোধনের টিপলস) ধাবনযোগ্য (যদিও ব্যতিক্রমগুলি সম্ভব)। সুতরাং এটি কাজ করে না:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
কী হিসাবে ডিক ব্যবহার করতে আপনাকে এটিকে এমন কিছুতে রূপান্তর করতে হবে যা প্রথমে হ্যাশ হতে পারে। আপনি যে কী ডিকটি কী হিসাবে ব্যবহার করতে চান তা কেবলমাত্র পরিবর্তনযোগ্য মানগুলি নিয়ে গঠিত হলে আপনি এটির মতো এখানে একটি হ্যাশেবল উপস্থাপনা তৈরি করতে পারেন:
>>> key = frozenset(dict_key.items())
এখন আপনি keyকী dictবা set: তে কী হিসাবে ব্যবহার করতে পারেন
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
অবশ্যই আপনি যখনই ডিক ব্যবহার করে কোনও কিছু সন্ধান করতে চান তখন অবশ্যই অনুশীলনের পুনরাবৃত্তি করতে হবে:
>>> some_dict[dict_key] # Doesn't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> some_dict[frozenset(dict_key.items())] # Works
True
আপনি dictকী হিসাবে কীটি ব্যবহার করতে চান তার মানগুলি হ'ল ডিক্টস এবং / অথবা তালিকাগুলি, আপনার পুনরুক্তিভাবে সম্ভাব্য কীটি "হিমায়িত" করা দরকার। এখানে একটি সূচনা পয়েন্ট:
def freeze(d):
if isinstance(d, dict):
return frozenset((key, freeze(value)) for key, value in d.items())
elif isinstance(d, list):
return tuple(freeze(value) for value in d)
return d