【Python】TypeError: unhashable type: 'list' エラーの原因と解決方法
Pythonの辞書(dict)では、キーとしてハッシュ可能(hashable)なデータ型のみを指定できます。リストはハッシュ不可能なデータ型のため、リストを辞書のキーとして指定すると「TypeError: unhashable type: 'list'」というエラーが発生します。
この記事では、このエラーの意味と発生する理由を解説し、実際のコード例を通して具体的な解決方法を紹介します。
TypeError: unhashable type: 'list' とは
辞書は「キー」と「値」の2つの要素で構成されています。キーは特定の値に関連付けられたラベルのようなものであり、値にアクセスする際にはそのキー名を参照します。
値にはリストから文字列まで任意のデータ型を使用できますが、キーとして許容されるのはハッシュ可能なオブジェクトのみです。ハッシュ可能なオブジェクトとは、ハッシュ値が時間経過によって変化しないオブジェクトのことで、タプルや文字列などが該当します。
一方、リストは不変のハッシュ値を持ちません。ハッシュ値が変化する可能性があるため、リストを辞書のキーとして指定することはできないのです。
エラーが発生するコード例
ここでは、平均点が75点を超える学生のリストを作成するプログラムを例に考えます。このリストには、各学生の名前と成績を辞書形式で格納します。まず、全校生徒の情報を含むリストから処理を始めましょう。
最初に、学生のリストと、優秀な学生を格納するための辞書を定義します。
students = [
{ "name": "Linda", "grades": [84, 82, 65] },
{ "name": "Alex", "grades": [67, 68, 83] },
{ "name": "Holly", "grades": [72, 74, 81] }
]
top_students = {}
「students」リストの各要素は辞書になっており、それぞれ「name」と「grades」という2つのキーを持っています。また、優秀な学生の情報を格納するための空の辞書「top_students」も定義しました。
次に、forループを使って平均点が75点を超える学生を抽出し、新しい辞書に追加していきます。
for s in students: average = sum(s["grades"]) / len(s["grades"]) if average > 75: top_students[s["grades"]] = s["name"]
ループの各イテレーションでは、学生の全成績の合計を成績の件数で割ることで平均点を計算しています。
続いて、その平均点が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"]
このエラーが発生する原因は、リストを辞書のキーとして代入しようとしたことにあります。ループの1回目のイテレーションでこの行が処理されるとき、Pythonは次のようなキーと値を持つ辞書を作成しようとします。
{ [84, 82, 65]: "Linda" }
これは無効な辞書です。リストをキーとして代入することはできないため、エラーが発生します。
この問題を解決するには、成績のリストではなく、学生の名前を辞書のキーとして使用します。
top_students[s["name"]] = s["grades"]
これで、成績のリストはキーではなく値として代入されるようになりました。辞書のキーは学生の名前です。もう一度コードを実行してみましょう。
{'Linda': [84, 82, 65], 'Holly': [72, 74, 81]}
今度は、優秀な学生の情報を含む辞書が正常に作成されました。直近3回のテストの平均点が75点を超えた学生がすべて辞書に登録されています。
作成された辞書の構造は以下の通りです。
- キー:Linda、Holly
- 値:[84, 82, 65]、[72, 74, 81]
キー名に文字列を代入するように変更したことで、コードが正常に動作するようになりました。
まとめ
「TypeError: unhashable type: 'list'」エラーは、リストを辞書のキーとして代入しようとしたときに発生します。このエラーを解決するには、文字列やタプルなど、ハッシュ可能なオブジェクトのみを辞書のキーとして指定するようにしてください。
これであなたも、プロの開発者のようにこのエラーを解決できるはずです!
-
Pythonの辞書メソッド一覧|使い方と機能をわかりやすく解説
はじめに Pythonの辞書(dict)は、キーと値のペアでデータを管理できる非常に便利なデータ構造です。この記事では、辞書で直接使える辞書メソッドと、辞書の操作に役立つ組み込み関数を一覧表にまとめて紹介します。それぞれの機能を把握しておくと、日常的なコーディングの効率が大きく向上します。 辞書の主なメソッド一覧 以下は、Pythonの辞書オブジェクトで利用できる代表的なメソッドです。 No.メソッド名と説明 1dict.clear()辞書内のすべての要素(キーと値のペア)を削除します。 2dict.copy()辞書のコピー(浅いコピー)を作成して返します。 3dict.fromkeys(
-
PythonでTypeError例外をキャッチ(捕捉)する方法
PythonにおけるTypeErrorは、互換性のない型のオブジェクト同士を組み合わせた場合や、関数に想定外の型の引数を渡した場合に発生する例外です。例えば、リストと文字列を連結しようとしたり、数値を必要とする処理に文字列を渡したりすると、このエラーが発生します。TypeErrorの主な発生原因異なる型のオブジェクトを演算子で結合・操作した場合(例:リスト + 文字列)関数やメソッドに、期待される型と異なる型の引数を渡した場合整数と文字列など、比較できない型同士を比較した場合try-exceptを使ったTypeErrorの捕捉方法TypeErrorが発生してもプログラムを停止させずに処理を続行