A'yı dictbaşka bir anahtar için dictveya bir anahtar kelime olarak kullanmaya çalışıyorsunuz set. Bu işe yaramaz çünkü anahtarlar yıkanabilir olmalıdır. Genel bir kural olarak, sadece değiştirilemeyen nesneler (teller, tamsayılar, şamandıralar, frozensets, değişmezler tuples) yıkanabilir (istisnalar mümkündür). Yani bu işe yaramıyor:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Bir dikteyi anahtar olarak kullanmak için, önce karma olabilen bir şeye dönüştürmeniz gerekir. Anahtar olarak kullanmak istediğiniz dikte yalnızca değişmez değerlerden oluşuyorsa, bunun gibi yıkanabilir bir temsili oluşturabilirsiniz:
>>> key = frozenset(dict_key.items())
Artık keya dictveya set:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Elbette, bir diksiyon kullanarak bir şey aramak istediğinizde egzersizi tekrarlamanız gerekir:
>>> 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
Eğer dictanahtar kendilerini dicts ve / veya listeleri değerlere sahip olarak kullanmak istediğiniz, özyinelemeli müstakbel anahtarı "dondurmak" gerekir. İşte bir başlangıç noktası:
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