Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python TypeError:ハッシュ不可能なタイプ:「dict」ソリューション

Python言語は、辞書のキーとして使用できるものに固有のものです。 Python辞書では、すべてのキーがハッシュ可能である必要があります。

辞書にキーを追加するときにハッシュ不可能なキータイプを使用しようとすると、「TypeError:ハッシュ不可能なタイプ:「dict」」エラーが発生します。

このガイドでは、このエラーの意味と、エラーが発生する理由について説明します。このエラーの例を見ていき、コードでエラーを解決する方法を学ぶことができます。

TypeError:ハッシュ不可能なタイプ:「dict」

辞書は、キーと値の2つの部分で構成されています。キーは、値にバインドされる識別子です。キーを参照すると、そのキーに関連付けられている値を取得できるようになります。

辞書のキーになることができるのは、ハッシュ可能なオブジェクトのみです。文字列、整数、タプル、フリーズセットなどの不変オブジェクトは、一部の例外を除いてハッシュ可能です。したがって、辞書を辞書のキーとして使用することはできません。

辞書にアイテムを追加するには、有効なハッシュ可能なキーを指定する必要があります。たとえば、「name」は有効なキーですが、{「name」:「test」}は有効ではありません。

シナリオ例

ここでは、ある辞書から別の辞書に、パン屋で5回以上販売されたすべてのケーキを追加するプログラムを作成します。

各ケーキに関する辞書を含むケーキのリストを宣言することから始めます。また、5回以上販売されたケーキを保存できる辞書を定義します。

参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。

平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。

cakes = [
	{
"name": "Black Forest Gateau", "sold": 3
},
{
"name": "Carrot Cake", "sold": 7
},
{
"name": "Coconut and Lime Cake", "sold": 9
}
]
sold_more_than_five = {}

「ケーキ」リストには3つの辞書が含まれています。各辞書には、2つのキーと値が含まれています。キーネームは「ケーキ」と「販売」です。

ここで、ケーキのリストを調べて、5回以上販売されたケーキを見つけるforループを作成します。これらのケーキは「sold_more_than_five」辞書に追加されます:

for c in cakes:
	if c["sold"] > 5:
		sold_more_than_five[c] = c["sold"]
		print(c["name"] + " has been sold more than five times.")

print(sold_more_than_five)

forループでは、各ディクショナリの「sold」の値が5より大きいかどうかを比較します。大きい場合、そのアイテムは「sold_more_than_five」ディクショナリに追加されます。次に、特定のケーキが5回以上販売されたことをユーザーに通知するメッセージがコンソールに出力されます。

ループが実行されたら、「sold_more_than_five」ディクショナリをコンソールに出力します。

コードを実行して、プログラムが機能することを確認します。

Traceback (most recent call last):
  File "main.py", line 16, in <module>
	sold_more_than_five[c] = c["sold"]
TypeError: unhashable type: 'dict'

コードはエラーを返します。

ソリューション

別の辞書を使用して辞書キーを作成しようとしているため、コードは機能しません。

「c」の値は、「ケーキ」リストの辞書と同じです。これは、「sold_more_than_five」ディクショナリにアイテムを追加しようとしたときに、誤ってディクショナリをキーとして追加しようとしていることを意味します。

sold_more_than_five[c] = c["sold"]

「キャロットケーキ」ケーキに対して「if」ステートメントを実行すると、コードが実行されます。

sold_more_than_five[{"name": "Carrot Cake", "sold": 7}] = 7

辞書をキーとして辞書に追加しようとしているため、これは無効です。この問題は、辞書キーの名前としてc [“ name”]を使用することで解決できます。

sold_more_than_five[c["name"]] = c["sold"]

この改訂されたコードでコードを実行します。

Carrot Cake has been sold more than five times.
Coconut and Lime Cake has been sold more than five times.

{'Carrot Cake': 7, 'Coconut and Lime Cake': 9}

コードは正常に実行されます。現在、辞書ではなく、各ケーキの名前をキーとして使用しています。

結論

「TypeError:unhashable type:‘dict’」エラーは、キーがハッシュ不可能なオブジェクトである辞書にアイテムを作成しようとすると発生します。辞書のキーとして使用できるのは、文字列、タプル、整数などの不変オブジェクトのみです。

このエラーを解決するには、辞書にアイテムを作成するときにハッシュ可能なオブジェクトのみを使用するようにしてください。これで、プロの開発者のようにこの一般的なPythonエラーを解決する準備が整いました!


  1. Pythonの辞書メソッド

    以下に示すPythonの辞書メソッドがいくつかあります- Sr.No メソッドの名前と説明 1 Python辞書clear() すべてのアイテムをクリアする 2 Python辞書copy() 辞書のコピー 3 keys()からのPython辞書 指定されたシーケンスから辞書を作成します 4 Pythonディクショナリget() キーの価値を得る 5 Python辞書items() 辞書のアイテムの表示 6 Python辞書keys() すべてのキーを表示 7

  2. PythonでTypeError例外をキャッチする方法は?

    TypeErrorsは、間違ったタイプのオブジェクトを組み合わせたり、間違ったタイプのオブジェクトで関数を呼び出したりすることで発生します。 例 import sys try : ny = 'Statue of Liberty' my_list = [3, 4, 5, 8, 9] print  my_list + ny except TypeError as e: print e print sys.exc_type 出力 can only concatenate list (not ""str") to list <type &#