Python TypeError:ハッシュ不可能なタイプ:「リスト」ソリューション
Pythonディクショナリは、ハッシュ可能なデータ型のみをディクショナリのキーとして受け入れます。リストはハッシュ可能なデータ型ではありません。辞書のキーとしてリストを指定すると、「TypeError:unhashable type:‘list’」エラーが発生します。
このガイドでは、このエラーの意味と、コードにエラーが表示される理由について説明します。このエラーの例を見て、解決方法を説明します。
TypeError:ハッシュ不可能なタイプ:「リスト」
辞書には、キーと値の2つの部分があります。キーは、特定の値に関連付けられたラベルです。値にアクセスするには、その値のキー名を参照する必要があります。
値はリストから文字列まで、任意のデータ型にすることができますが、キーとして使用できるのはハッシュ可能なオブジェクトのみです。ハッシュ可能なオブジェクトは、時間の経過とともに変化しないハッシュ値を持つオブジェクトです。ハッシュ可能なオブジェクトの例は、タプルと文字列です。
リストには不変のハッシュ値はありません。それらのハッシュ値は時間とともに変化する可能性があります。これは、リストをディクショナリキーとして指定できないことを意味します。
シナリオ例
平均成績が75を超える生徒のリストを作成するプログラムを作成しましょう。このリストには、各生徒とその成績の辞書レコードが含まれます。この辞書を作成するには、学校のすべての生徒とその成績のリストを含む辞書から作業します。
生徒のリストとトップクラスの生徒用の辞書を定義することから始めましょう:
students = [ { "name": "Linda", "grades": [84, 82, 65] }, { "name": "Alex", "grades": [67, 68, 83] }, { "name": "Holly", "grades": [72, 74, 81] } ] top_students = {}
「学生」リストの各値は辞書です。各辞書には、名前と成績の2つのキーが含まれています。 「top_students」という辞書を定義しました。この辞書には、トップクラスの学生に関する情報が含まれています。
参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。
平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。
この辞書を定義したので、forループを使用して、平均成績が75を超える学生を除外し、新しい辞書に追加します。
for s in students: average = sum(s["grades"]) / len(s["grades"]) if average > 75: top_students[s["grades"]] =s["name"]
forループの各反復で、学生が獲得したすべての成績の平均を計算します。これを行うには、すべての成績の合計を、記録された成績の数で割ります。
次に、その平均が75より大きいかどうかを確認します。大きい場合は、top_studentsディクショナリに、学生の名前とその成績を使用して新しいエントリを作成します。
最後に、top_students辞書をコンソールに出力して、平均成績が75を超えるすべての学生を確認します。
print(top_students)
コードを実行して、何が起こるかを確認します。
Traceback (most recent call last): File "main.py", line 11, in <module> top_students[s["grades"]] = s["name"] TypeError: unhashable type: 'list'
コードを正常に実行できません。
ソリューション
私たちのコードは、インタプリタが11行目に到達するまで機能します。この行では、コードは次のように述べています。
top_students[s["grades"]] = s["name"]
コードのエラーは、辞書のキーとしてリストを割り当てようとしたためです。コードがループの最初の反復でこの行を解析するとき、コードは次のキーと値を使用して辞書を作成しようとします。
{ [84, 82, 65]: "Linda" }
これは無効な辞書です。私たちのコードは、機能しないキーとしてリストを割り当てようとします。
この問題を解決するために、成績のリストではなく、辞書のキーとして生徒の名前を使用します。
top_students[s["name"]] = s["grades"]
成績のリストをキーではなく値として割り当てました。生徒の名前が辞書の鍵です。コードを実行してみましょう:
{'Linda': [84, 82, 65], 'Holly': [72, 74, 81]}
私たちのコードは、成績優秀な学生に関する情報を含む辞書を正常に作成します。最後の3つのテストの平均成績が75を超えるすべての学生が辞書に追加されました。
私たちの辞書は次のように分類されます。
- キー:リンダ、ホリー
- 値:[84、82、65]、[72、74、81]
キー名に文字列を割り当てているため、コードは機能します。
結論
辞書でリストをキーとして割り当てようとすると、「TypeError:unhashable type:‘list’」エラーが発生します。このエラーを解決するには、辞書のキーとして、文字列やタプルなどのハッシュ可能なオブジェクトのみを割り当てるようにしてください。
これで、プロのコーダーのようにこのエラーを解決する準備が整いました!
-
Pythonの辞書メソッド
以下に示すPythonの辞書メソッドがいくつかあります- Sr.No メソッドの名前と説明 1 Python辞書clear() すべてのアイテムをクリアする 2 Python辞書copy() 辞書のコピー 3 keys()からのPython辞書 指定されたシーケンスから辞書を作成します 4 Pythonディクショナリget() キーの価値を得る 5 Python辞書items() 辞書のアイテムの表示 6 Python辞書keys() すべてのキーを表示 7
-
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