HOWTO · Python
Python TypeError: Unhashable タイプ: リスト
Python では、Python 辞書はハッシュ可能なデータ型のみをキーとして受け入れ、リストはハッシュ可能ではないため、リストを辞書のキーとして提供すると TypeError ハッシュ不可能な型リストが発生します。
この記事では、TypeError: unhashable type: 'list' と、それを Python で修正する方法について説明します。
Python の TypeError: unhashable type: 'list'
このエラーは、リストなどのハッシュ不可能なオブジェクトをキーとして Python 辞書に渡したり、関数のハッシュ値を検索したりするときに発生します。
Dictionaries は Python のデータ構造であり、キーと値のペアで機能します。すべてのキーにはそれに対する値があり、値の値にアクセスするには、配列インデックスなどのキーが必要です。
辞書の構文:
dic = {"key": "Values"}
ハッシュ可能なオブジェクトは、値が時間の経過とともに変化せず、同じままであるオブジェクトです tuples と strings は、ハッシュ可能なオブジェクトのタイプです。
コード:
# creating a dictionary
dic = {
# list as a key --> Error because lists are immutable
["a", "b"]: [1, 2]
}
print(dic)
出力:
TypeError: unhashable type: 'list'
リスト ["a","b"] を key として使用しましたが、コンパイラは TypeError: unhashable type: 'list' をスローしました。
リストのハッシュ値を手動で見つけてみましょう。
コード:
lst = ["a", "b"]
hash_value = hash(lst)
print(hash_value)
出力:
TypeError: unhashable type: 'list'
hash() 関数は、指定されたオブジェクトのハッシュ値を見つけるために使用されますが、オブジェクトは string、tuple などのように不変でなければなりません。
Python のハッシュ関数
hash() 関数は、不変オブジェクトを暗号化し、オブジェクトのハッシュ値と呼ばれる一意の値を割り当てる暗号化手法です。 データのサイズに関係なく、同じサイズの一意の値を提供します。
コード:
string_val = "String Value"
tuple_val = (1, 2, 3, 4, 5)
msg = """Hey there!
Welcome to DelfStack"""
print("Hash of a string object\t\t", hash(string_val))
print("Hash of a tuple object\t\t", hash(tuple_val))
print("Hash of a string message\t", hash(tuple_val))
出力:
Hash of a string object -74188595
Hash of a tuple object -1883319094
Hash of a string message -1883319094
ハッシュ値は同じサイズで、すべての値に対して一意です。
Python の TypeError: unhashable type: 'list' を修正
Python で TypeError を修正するには、不変オブジェクトを辞書のキーおよび hash() 関数の引数として使用する必要があります。 上記のコードでは、hash() 関数が tuple や string などの可変オブジェクトで完全に機能することに注意してください。
辞書の TypeError: unhashable type: 'list' を修正する方法を見てみましょう。
コード:
# creating a dictionary
dic = {
# string as key
"a": [1, 2]
}
print(dic)
出力:
{'a': [1, 2]}
今回は、文字列 "a" をキーとして提供します。これは、strings が変更可能であるため、うまく機能します。