Pythonの「TypeError: unhashable type: 'slice'」エラーの原因と解決策
Pythonの辞書(dictionary)は、リストのようにスライス操作を行うことができません。これは、辞書が任意のキー値を持つことができ、ゼロからインデックス化されていないためです。辞書をリストのようにスライスしようとすると、「TypeError: unhashable type: 'slice'」というエラーが発生します。
この記事では、このエラーの意味と発生理由を解説し、実際のコード例を通じて解決方法をご紹介します。
スライスとは何か
スライスとは、文字列、リスト、タプルなどのシーケンス(順序付きデータ)の一部分を取り出す操作のことです。名前の通り、シーケンスの「一切れ」を切り取るイメージです。
以下のプログラムを見てみましょう。
news_sites = ["New York Times", "Washington Post", "CNN"] print(news_sites[:2])
このコードは、「news_sites」リストの最初の2つの値を取得してコンソールに出力します。実行結果は次のとおりです。
['New York Times', 'Washington Post']
これがスライスの一例です。コロンとインデックス値を指定することで、Pythonに対してどの要素を取得するかを指示しています。
一方、辞書はリストのようにスライスすることができません。辞書にはインデックス番号が存在しないため、この構文は適用されないのです。
エラーが発生するコード例
パソコンパーツショップで販売されているキーボードの情報を表示するプログラムを作成してみましょう。まず、キーボードに関するデータを含む辞書を定義します。
keyboard = {
"name": "Huntsman Mini",
"brand": "Razer",
"price": 119.99,
"switch_type": "Razer Switches",
}
このプログラムは、キーボードの名前、ブランド、価格、スイッチタイプの情報を格納しています。ここで、顧客に表示したいのは、キーボードの名前・ブランド・価格の3つの項目だけだとしましょう。
そのために、スライスを使って辞書の最初の3つの項目を取得しようとしたとします。
show_to_customer = keyboard[:3]
続いて、forループでこの結果を反復処理し、各項目をコンソールに出力します。
for s in show_to_customer: print(s[1])
インデックスを使って「show_to_customer」変数内の各レコードから値を取り出し、print()文でコンソールに出力する想定です。しかし、このコードを実行すると、次のようなエラーが発生します。
Traceback (most recent call last): File "main.py", line 8, in <module> show_to_customer = keyboard[:3] TypeError: unhashable type: 'slice'
解決策
リストとは異なり、辞書はスライスできません。辞書にはインデックス番号がないため、スライス構文で要素を取得することは不可能です。辞書のデータはキーと値のペアとして保存されています。したがって、先ほどのforループによるアプローチは不適切だということになります。
解決するには、辞書からアクセスしたい値を直接指定する必要があります。具体的には、辞書内の該当するキー名を参照します。
コードを修正して、表示したい各値に個別にアクセスしてみましょう。
keyboard = {
"name": "Huntsman Mini",
"brand": "Razer",
"price": 119.99,
"switch_type": "Razer Switches",
}
print("Name: " + keyboard["name"])
print("Brand: " + keyboard["brand"])
print("Price: $" + str(keyboard["price"]))
それぞれのprint()文が、辞書の異なる値を参照しています。最初のprint文はラベル「Name: 」と辞書の「name」の値を出力し、2つ目と3つ目のprint文はそれぞれ「brand」と「price」の値を出力します。
「price」の値は数値型のため、str()メソッドで文字列に変換し、連結演算子(+)を使って「Price: $」というラベルと連結しています。
修正後のプログラムを実行すると、次のようになります。
Name: Huntsman Mini Brand: Razer Price: $119.99
今度は、表示したい3つの情報が正常に出力されました。ユーザーはキーボードの名前、ブランド、価格を問題なく確認できます。
まとめ
「TypeError: unhashable type: 'slice'」エラーは、スライス構文を使って辞書の要素にアクセスしようとした際に発生します。このエラーを解決するには、辞書からアクセスしたい要素をキー名で直接指定するようにしましょう。
これで、プロのようにこのエラーを解決できる知識が身につきました!
-
Pythonの文字列データ型の基本:定義方法・スライス・連結・繰り返しを解説
Pythonにおける文字列とはPythonの文字列(string)は、引用符で囲まれた連続した文字の集合として表現されるデータ型です。Pythonでは、単一引用符(...)と二重引用符(...)のどちらのペアでも文字列を定義でき、両者に機能上の違いはありません。また、文字列の一部(部分文字列)を取り出すには、スライス演算子([ ] および [:])を使用します。インデックスは文字列の先頭が「0」から始まり、末尾に向かって「-1」という負の値で逆方向にも数えられるのが特徴です。文字列の連結と繰り返し文字列に対して使える主な演算子は以下のとおりです。+ (プラス記号):文字列同士を連結する演算子*
-
PythonでTypeError例外をキャッチ(捕捉)する方法
PythonにおけるTypeErrorは、互換性のない型のオブジェクト同士を組み合わせた場合や、関数に想定外の型の引数を渡した場合に発生する例外です。例えば、リストと文字列を連結しようとしたり、数値を必要とする処理に文字列を渡したりすると、このエラーが発生します。TypeErrorの主な発生原因異なる型のオブジェクトを演算子で結合・操作した場合(例:リスト + 文字列)関数やメソッドに、期待される型と異なる型の引数を渡した場合整数と文字列など、比較できない型同士を比較した場合try-exceptを使ったTypeErrorの捕捉方法TypeErrorが発生してもプログラムを停止させずに処理を続行