Python "TypeError: unhashable type: ‘dict’ " は、辞書を別の辞書のキーまたはコレクションの要素として使用するときに発生します。
このエラーを解決するには、代わりに frozenset
を使用するか、キーとして使用する前に辞書を JSON 文字列に変換する必要があります。
ある辞書を別の辞書のキーとして使用すると、エラーが発生します。
# ????️ using dictionary as a key in a dictionary # ⛔️ TypeError: unhashable type: 'dict' my_dict = {'name': 'Jiyik', {'country': 'China'}: 'address'}
または、set
オブジェクトの要素として辞書を使用する場合。
# ????️ 使用字典作为集合中的元素 # ⛔️ TypeError: unhashable type: 'dict' my_set = {{'name': 'Jiyik'}}
辞書オブジェクトは変更可能でハッシュ不可能であるため、辞書を辞書内のキーまたはコレクション内の要素として使用することはできません。
このエラーを解決する 1 つの方法は、辞書をキーとして使用する前に JSON 文字列に変換することです。
import json # ????️ 将字典转换为 JSON 字符串 my_json = json.dumps({'country': 'China'}) my_dict = {'name': 'Jiyik', my_json: 'address'} print(my_dict) # ????️ {'name': 'Jiyik', '{"country": "China"}': 'address'} # ????️ 当你必须访问字典中的键时 print(my_dict[json.dumps({'country': 'Austria'})]) # ????️ address
json.dumps
メソッドは、Python オブジェクトを JSON 形式の文字列に変換します。これが機能するのは、文字列が不変でハッシュ可能であるためです。
対照的に、json.loads
メソッドは、my_dict = json.loads(my_json_str)
など、JSON 文字列をネイティブ Python オブジェクトに解析します。
エラーを解決するもう 1 つの方法は、frozenset
を使用することです。
my_key = {'country': 'China'} key = frozenset(my_key.items()) print(key) # ????️ frozenset({('country', 'China')}) my_dict = {'name': 'Jiyik', key: 'address'} # ????️ 当我们必须访问 key 时 print(my_dict[frozenset(my_key.items())]) # ????️ 'address'
dict.items
メソッドは、辞書項目 ((キー、値) ペア) の新しいビューを返します。
# ????️ dict_items([('name', 'jiyik'), ('age', 30)]) print({'name': 'jiyik', 'age': 30}.items())
辞書の項目を使用して、辞書内のキー (および別のセットの要素) として使用できる frozenset
を作成します。
frozenset
は Python コレクション オブジェクトの不変バージョンであるため、辞書内のキーとして、または別のコレクション内の要素として使用できます。
辞書内のキーにアクセスするには、同じメソッドを使用する必要があることに注意してください。
frozenset(my_key.items()) を呼び出した結果を変数に保存し、ディクショナリ内のキーを設定またはアクセスするときにフローズンセットを再利用できます。
dict_key = {'id': 1, 'country': 'China'} # ✅ 转换为元组 my_tuple = tuple(dict_key) print(my_tuple) # ????️ ('id', 'country') my_dict = {'name': 'Jiyik', my_tuple: 'address'} print(my_dict) # ????️ {'name': 'Jiyik', ('id', 'country'): 'address'} # ????️ 当你必须访问字典中的键时 print(my_dict[my_tuple]) # ????️ address
dict_value = {'id': 1, 'country': 'China'} my_dict = {'name': 'Jiyik', 'data': dict_value} # ????️ {'name': 'Jiyik', 'data': {'id': 1, 'country': 'China'}} print(my_dict) print(my_dict['data']) # ????️ {'id': 1, 'country': 'China'}
another_dict = {'id': 1, 'country': 'China'} my_dict = {'name': 'Jiyik'} for key, value in another_dict.items(): my_dict[key] = value # ????️ {'name': 'Jiyik', 'id': 1, 'country': 'China'} print(my_dict)
dict.items メソッドは、辞書項目 ((キー、値) ペア) の新しいビューを返します。
my_dict = {'id': 1, 'name': 'Jiyik'} # ????️ dict_items([('id', 1), ('name', 'Jiyik')]) print(my_dict.items())
オブジェクトがハッシュ可能である場合、これらのデータ構造は内部でハッシュ値を使用するため、オブジェクトを辞書のキーおよびコレクションの要素として使用できます。ハッシュ可能なオブジェクトには、
str、int、bool、tuple、frozenset#が含まれます。 ##。 ハッシュ化できないオブジェクトには、
list、dict、set が含まれます。
hash()タプルと凍結セットは、その要素がハッシュ可能である場合にのみハッシュ可能であることに注意してください。
オブジェクトが組み込みのオブジェクトがハッシュ可能かどうかの確認
print(hash('jiyik.com')) # ????️ 4905958875846995527 # ⛔️ TypeError: unhashable type: 'dict' print(hash({'name': 'Jiyik'}))
ハッシュ値は、辞書検索中に辞書キーを比較するために使用される整数です。
!> ハッシュ可能オブジェクトのハッシュ値は、その存続期間中は決して変更されません。これが、ほとんどの不変オブジェクトがハッシュ可能であるのに対し、可変オブジェクトはハッシュ可能ではない理由です。
辞書のようなオブジェクトは、辞書の内容が変更される可能性があるため、変更可能です。
my_dict = {'name': 'Fql'} my_dict['name'] = 'Jiyik' print(my_dict) # ????️ {'name': 'Jiyik'}
一方、
fronzensetとプリミティブ値を含むタプル オブジェクトは不変 (およびハッシュ可能) です。
辞書はキーによってインデックス付けされます。キーには文字列や数値などの不変型を使用できます。
fronzenset
またはタプルに変更可能なオブジェクト (リストなど) が含まれている場合、それを辞書内のキーまたはセット内の要素として使用することはできません。
変数に格納されるオブジェクトのタイプが不明な場合は、type()
関数を使用してください。
my_dict = {'name': 'Jiyik'} print(type(my_dict)) # ????️ <class 'dict'> print(isinstance(my_dict, dict)) # ????️ True my_str = 'jiyik.com' print(type(my_str)) # ????️ <class 'str'> print(isinstance(my_str, str)) # ????️ True
type
この関数はオブジェクトのタイプを返します。
渡されたオブジェクトが渡されたクラスのインスタンスまたはサブクラスの場合、isinstance
関数は True を返します。
以上がPython で TypeError:unhashable type:'dict' エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。