आप 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आप कुंजी के रूप में उपयोग करना चाहते हैं, तो वे मान हैं जो स्वयं dicts और / या सूचियाँ हैं, आपको भावी कुंजी को पुन: "फ्रीज" करने की आवश्यकता है। यहाँ एक प्रारंभिक बिंदु है:
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