Python で TypeError:unhashable type:'dict' エラーを解決する方法

王林
リリース: 2023-05-12 18:58:17
転載
2280 人が閲覧しました

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'}}
ログイン後にコピー

辞書オブジェクトは変更可能でハッシュ不可能であるため、辞書を辞書内のキーまたはコレクション内の要素として使用することはできません。

辞書を JSON 文字列に変換してエラーを解決します。

このエラーを解決する 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 オブジェクトに解析します。

frozenset を使用したエラー解決

エラーを解決するもう 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'}
ログイン後にコピー

辞書を別の辞書の値に設定します。

制限はディクショナリ値には適用されないため、これは許可されます。

ある辞書のすべてのキーと値のペアを別の辞書に追加する

ある辞書のすべてのキーと値のペアを別の辞書に追加する必要がある場合は、for ループを使用できます。

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())
ログイン後にコピー

各反復で、キーと値のペアを別の辞書に設定します。

Python のハッシュ可能オブジェクトとハッシュ不可能なオブジェクト

Python の不変の組み込みオブジェクトのほとんどはハッシュ可能ですが、可変オブジェクトはハッシュ可能ではありません。

オブジェクトがハッシュ可能である場合、これらのデータ構造は内部でハッシュ値を使用するため、オブジェクトを辞書のキーおよびコレクションの要素として使用できます。

ハッシュ可能なオブジェクトには、

strintbooltuplefrozenset#が含まれます。 ##。 ハッシュ化できないオブジェクトには、

list

dictset が含まれます。

タプルと凍結セットは、その要素がハッシュ可能である場合にのみハッシュ可能であることに注意してください。 オブジェクトがハッシュ可能かどうかの確認

オブジェクトが組み込みの
hash()

関数に渡すことで、オブジェクトがハッシュ可能かどうかを確認できます。

print(hash('jiyik.com'))  # ????️ 4905958875846995527

# ⛔️ TypeError: unhashable type: 'dict'
print(hash({'name': 'Jiyik'}))
ログイン後にコピー

ハッシュ関数は、渡されたオブジェクト (存在する場合) のハッシュ値を返します。

Python で TypeError:unhashable type:dict エラーを解決する方法ハッシュ値は、辞書検索中に辞書キーを比較するために使用される整数です。

!> ハッシュ可能オブジェクトのハッシュ値は、その存続期間中は決して変更されません。これが、ほとんどの不変オブジェクトがハッシュ可能であるのに対し、可変オブジェクトはハッシュ可能ではない理由です。

辞書のようなオブジェクトは、辞書の内容が変更される可能性があるため、変更可能です。

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 &#39;dict&#39;>
print(isinstance(my_dict, dict))  # ????️ True

my_str = &#39;jiyik.com&#39;

print(type(my_str))  # ????️ <class &#39;str&#39;>
print(isinstance(my_str, str))  # ????️ True
ログイン後にコピー

type この関数はオブジェクトのタイプを返します。

渡されたオブジェクトが渡されたクラスのインスタンスまたはサブクラスの場合、isinstance 関数は True を返します。

以上がPython で TypeError:unhashable type:'dict' エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート