インデックスエラーとキーエラーを理解しよう

学習の目標

本章では、以下の内容を学習します。

  • IndexError(インデックスエラー)の発生原因と対処法を理解する
  • KeyError(キーエラー)が起こる場面と解決方法を学ぶ
  • ValueError(値エラー)の基本概念を把握する
  • データ操作における安全なプログラムの書き方を習得する
  • エラーが起こりやすい場面を事前に想定する考え方を身につける

はじめに

前回の章では、基本的なエラーの種類について学習しました。

今回は、リストや辞書を扱う際によく遭遇するエラーについて詳しく学んでいきましょう。これらのエラーは、データを操作する際に非常によく発生するため、原因と対処法をしっかりと理解しておくことが大切です。

リストの要素にアクセスしたり、辞書からデータを取得したりする際に、「あれ、エラーが出た」という経験は、プログラミングを学習する皆さんが必ず通る道です。これらのエラーを理解することで、より安心してデータ操作ができるようになります。

IndexError(インデックスエラー)

IndexErrorとは

IndexErrorは、リストや文字列で存在しないインデックス(位置)にアクセスしようとした時に発生するエラーです。

例えば、5つの席しかない映画館で「6番目の席に座りたい」と言っても、その席は存在しないため困ってしまいますよね。Pythonも同様に、存在しない位置のデータを要求されると困ってしまいます。

IndexErrorの例

VS Codeでindex_error_example.pyというファイルを作成し、以下のコードを入力してみましょう。

fruits = ["りんご", "バナナ", "オレンジ"]
print(fruits[3])

このコードを実行すると、以下のようなエラーが表示されます。

IndexError: list index out of range

このエラーが発生する理由を詳しく見てみましょう。リストfruitsには3つの要素が含まれており、それぞれのインデックスは以下のようになっています。

インデックス要素
0"りんご"
1"バナナ"
2"オレンジ"

Pythonのインデックスは0から始まるため、3つの要素があるリストでは、有効なインデックスは0、1、2となります。インデックス3は存在しないため、IndexErrorが発生するのです。

文字列でのIndexError

文字列でも同様のエラーが発生します。

message = "Hello"
print(message[10])

文字列"Hello"は5文字なので、有効なインデックスは0から4までです。インデックス10は存在しないため、IndexErrorが発生します。

IndexErrorの対処法

IndexErrorを防ぐためには、リストや文字列の長さを事前に確認することが大切です。

fruits = ["りんご", "バナナ", "オレンジ"]
print(f"リストの長さ: {len(fruits)}")

# 安全にアクセスする方法
if len(fruits) > 3:
    print(fruits[3])
else:
    print("インデックス3の要素は存在しません")

実行結果は以下のようになります。

リストの長さ: 3
インデックス3の要素は存在しません

KeyError(キーエラー)

KeyErrorとは

KeyErrorは、辞書で存在しないキーを使ってデータを取得しようとした時に発生するエラーです。

辞書は、キーと値のペアでデータを管理しています。存在しないキーでデータを探そうとすると、Pythonは「そんなキーは登録されていません」と教えてくれます。

KeyErrorの例

以下のコードをkey_error_example.pyとして作成してみましょう。

student = {
    "name": "田中太郎", 
    "age": 20, 
    "grade": "A"
}

print(student["score"])

このコードを実行すると、以下のようなエラーが表示されます。

KeyError: 'score'

辞書studentには"name""age""grade"のキーは存在しますが、"score"というキーは存在しないため、KeyErrorが発生します。

KeyErrorの対処法

KeyErrorを防ぐためには、いくつかの方法があります。

まず、get()メソッドを使用する方法です。get()メソッドは、キーが存在しない場合にエラーではなく、指定したデフォルト値を返してくれます。

student = {
    "name": "田中太郎", 
    "age": 20, 
    "grade": "A"
}

# get()メソッドを使用(デフォルト値なし)
score = student.get("score")
print(f"スコア: {score}")

# get()メソッドを使用(デフォルト値あり)
score_with_default = student.get("score", "未採点")
print(f"スコア(デフォルト値付き): {score_with_default}")

実行結果は以下のようになります。

スコア: None
スコア(デフォルト値付き): 未採点

もう一つの方法として、in演算子を使ってキーの存在を事前に確認することもできます。

student = {
    "name": "田中太郎", 
    "age": 20, 
    "grade": "A"
}

if "score" in student:
    print(f"スコア: {student['score']}")
else:
    print("スコアは登録されていません")

ValueError(値エラー)

ValueErrorとは

ValueErrorは、関数や演算に対して適切でない値を渡した時に発生するエラーです。

データの型は正しいけれど、その値では処理を実行できない場合に発生します。例えば、数値変換ができない文字列をint()関数に渡すようなケースです。

ValueErrorの例

以下のコードをvalue_error_example.pyとして作成してみましょう。

user_input = "abc"
number = int(user_input)
print(number)

このコードを実行すると、以下のようなエラーが表示されます。

ValueError: invalid literal for int() with base 10: 'abc'

int()関数は文字列を数値に変換する関数ですが、"abc"という文字列は数値として解釈できないため、ValueErrorが発生します。

リストでのValueError

リストのremove()メソッドでも、存在しない要素を削除しようとするとValueErrorが発生します。

fruits = ["りんご", "バナナ", "オレンジ"]
fruits.remove("メロン")

このコードを実行すると、以下のようなエラーが表示されます。

ValueError: list.remove(x): x not in list

ValueErrorの対処法

ValueErrorを防ぐためには、処理を実行する前に値が適切かどうかを確認することが大切です。

数値変換の場合は、以下のように対処できます。

user_input = "abc"

if user_input.isdigit():
    number = int(user_input)
    print(f"数値: {number}")
else:
    print("入力された値は数値ではありません")

リストの要素削除の場合は、以下のように事前確認ができます。

fruits = ["りんご", "バナナ", "オレンジ"]
target = "メロン"

if target in fruits:
    fruits.remove(target)
    print(f"{target}を削除しました")
else:
    print(f"{target}はリストに含まれていません")

エラーが起こりやすい場面を想定する

ユーザー入力を扱う時

ユーザーから入力を受け取る際は、予想外の値が入力される可能性を常に考慮する必要があります。

例えば、年齢を入力してもらう場合、数値以外の文字が入力される可能性があります。

user_age = input("年齢を入力してください: ")

# 数値かどうかを確認してから変換
if user_age.isdigit():
    age = int(user_age)
    print(f"あなたの年齢は{age}歳ですね")
else:
    print("数値を入力してください")

動的にデータを操作する時

プログラムの実行中にリストや辞書の内容が変わる場合は、常に最新の状態を確認してからアクセスすることが大切です。

shopping_list = ["パン", "牛乳"]

# リストの内容を表示
for i in range(len(shopping_list)):
    print(f"{i + 1}. {shopping_list[i]}")

# 安全にアクセスする例
index = 2  # ユーザーが選択したインデックス

if 0 <= index < len(shopping_list):
    print(f"選択された商品: {shopping_list[index]}")
else:
    print("存在しない番号が選択されました")

外部データを扱う時

ファイルやAPIから取得したデータは、期待している形式とは異なる可能性があります。データの構造や内容を確認してからアクセスすることが重要です。

まとめ

本章では、データ操作でよく遭遇するエラーについて学習しました。

IndexErrorは、リストや文字列で存在しないインデックスにアクセスしようとした時に発生します。len()関数で長さを確認してからアクセスすることで防げます。

KeyErrorは、辞書で存在しないキーを使ってデータを取得しようとした時に発生します。get()メソッドやin演算子を使って安全にアクセスできます。

ValueErrorは、適切でない値を関数や演算に渡した時に発生します。事前に値の妥当性を確認することで防げます。

これらのエラーは、データを扱う際に非常によく発生するものです。エラーの原因を理解し、事前に対策を講じることで、より安全で堅牢なプログラムを作成できるようになります。エラーを恐れずに、一つずつ丁寧に対処していきましょう。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
エラー処理と例外