PythonのKeyErrorを徹底解説!発生原因とスマートな対処法


この記事では、Pythonでプログラミングをする際によく遭遇するエラーの一つ、**KeyError**について詳しく解説します。KeyErrorは主に辞書(dict)から存在しないキーを使って値を取り出そうとしたときに発生します。このエラーの原因を理解し、適切な対処法を学ぶことで、より堅牢なコードを書けるようになります。

KeyErrorとは?

**KeyError**は、Pythonの辞書(dict)において、存在しないキーを指定して要素にアクセスしようとした場合に発生する例外です。辞書は「キーと値のペア」を格納するデータ構造であり、各キーは一意である必要があります。存在しないキーで値を取り出そうとすると、Pythonは「そのキーは辞書にないよ!」とKeyErrorを発生させて教えてくれます。

なぜKeyErrorが発生するのか?

KeyErrorが発生する主な理由は以下の通りです。

  1. キーのスペルミス: 辞書に存在するキーのスペルを間違えて記述した場合。

  2. キーの大文字・小文字: キーの大文字・小文字を間違えて記述した場合(Pythonのキーはケースセンシティブです)。

  3. 動的なキーの欠如: プログラムの実行中に動的に生成されるキーが、特定の条件下で辞書に存在しなかった場合。

  4. 辞書の変更: 辞書が途中で変更され、以前は存在したキーが削除された場合。


KeyErrorの発生例と対処法

ここでは、具体的なコード例を挙げながらKeyErrorの発生例と、それを防ぐための対処法を説明します。

例1: 存在しないキーで辞書にアクセス

Python
 
user_info = {
    "name": "Alice",
    "age": 30,
    "city": "Tokyo"
}

try:
    # 存在しないキー 'email' でアクセス
    email = user_info["email"]
    print(f"ユーザーのメールアドレス: {email}")
except KeyError:
    print("エラー: 辞書に 'email' キーが存在しません。")

# 存在するキーでのアクセス
print(f"ユーザーの名前: {user_info['name']}")

対処法:

  • dict.get()メソッドの使用: get()メソッドは、指定したキーが存在しない場合でもKeyErrorを発生させず、デフォルト値(指定しない場合はNone)を返します。

    Python
     
    email = user_info.get("email", "情報なし") # キーが存在しない場合は"情報なし"を返す
    print(f"ユーザーのメールアドレス: {email}") # 出力: ユーザーのメールアドレス: 情報なし
    
  • in演算子でキーの存在を確認: 辞書にキーが存在するかどうかを事前にチェックしてからアクセスします。

    Python
     
    if "email" in user_info:
        email = user_info["email"]
        print(f"ユーザーのメールアドレス: {email}")
    else:
        print("辞書に 'email' キーが存在しません。")
    
  • 例外処理(try-except: KeyErrorが発生する可能性がある場合に、そのエラーを捕捉して適切な代替処理を行います。上記の例がこれにあたります。


例2: defaultdictの活用(キーが存在しない場合にデフォルト値を自動生成)

collectionsモジュールのdefaultdictは、存在しないキーにアクセスされたときに、指定したデフォルトファクトリ関数(例えばintlistなど)を使って新しい値を自動的に生成し、そのキーを辞書に追加します。これにより、KeyErrorの発生を防ぎつつ、初期値の設定の手間を省けます。

Python
 
from collections import defaultdict

# デフォルト値がint(0)になるdefaultdict
word_counts = defaultdict(int) 

text = "apple banana apple orange"
words = text.split()

for word in words:
    word_counts[word] += 1 # キーが存在しない場合、自動的に0で初期化される

print(word_counts)
# 出力: defaultdict(<class 'int'>, {'apple': 2, 'banana': 1, 'orange': 1})

# 存在しないキーにアクセスしてもKeyErrorにならない
print(word_counts["grape"]) # 出力: 0 (自動的に初期化され、0が返される)

まとめ

KeyErrorはPythonの辞書操作において頻繁に遭遇するエラーですが、その原因と対処法を知っていれば、効果的にコードの堅牢性を高めることができます。dict.get()in演算子による事前チェック、try-exceptブロック、そしてdefaultdictの活用を適切に使い分けることで、より安全で読みやすいコードを書けるようになります。

これらの対処法をマスターして、Pythonでのデータ処理をさらにスムーズに進めましょう!

らくらくPython塾 – 読むだけでマスター

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座