Pythonの辞書で存在しないキーを安全に扱う方法|KeyError対策を徹底解説
Pythonには「辞書(Dictionary)」と呼ばれるコンテナ型があります。辞書ではキー(key)と値(value)を対応付けて管理でき、値へのアクセスは定数時間で行えるため非常に高速です。しかし、存在しないキーにアクセスしようとすると、エラーが発生してしまうという課題があります。
本記事では、辞書のキーが存在しない場合に発生するエラーへの対処法として、get()メソッド、setdefault()メソッド、そしてcollections.defaultdictの3つの手法をわかりやすく解説します。
存在しないキーにアクセスするとどうなる?
まず、辞書に存在しないキーへ直接アクセスした場合の挙動を確認してみましょう。
サンプルコード
country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
print(country_dict['Australia'])
print(country_dict['Canada']) # 存在しないキーのためエラーになる
実行結果
AU
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-2-a91092e7ee85> in <module>()
2
3 print(country_dict['Australia'])
----> 4 print(country_dict['Canada'])
KeyError: 'Canada'
このように、'Australia'は正常に出力されますが、登録されていない'Canada'にアクセスするとKeyErrorが発生し、プログラムが異常終了します。
方法1:get()メソッドでKeyErrorを回避する
get()メソッドを使えば、キーの有無を安全にチェックできます。このメソッドは2つの引数を受け取ります。第1引数は取得したいキー、第2引数は「キーが見つからなかった場合に返すデフォルト値」です。
- キーが存在する場合 → 対応する値を返す
- キーが存在しない場合 → 第2引数で指定したデフォルト値を返す
サンプルコード
country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
print(country_dict.get('Australia', 'Not Found'))
print(country_dict.get('Canada', 'Not Found'))
実行結果
AU Not Found
'Canada'は辞書に存在しないため、指定しておいたデフォルト値'Not Found'が返され、エラーにならずに処理が継続されます。
方法2:setdefault()メソッドでデフォルト値を設定する
setdefault()メソッドもget()と同様に2つの引数(キーとデフォルト値)を受け取ります。両者の違いは、キーが存在しなかった場合、そのキーとデフォルト値のペアを辞書に新しく追加する点です。
サンプルコード
country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
country_dict.setdefault('Canada', 'Not Present') # Canadaにデフォルト値を設定
print(country_dict['Australia'])
print(country_dict['Canada'])
実行結果
AU Not Present
setdefault()を実行した時点で'Canada': 'Not Present'が辞書に追加されるため、その後は通常の添字アクセスでもエラーなく値を取得できます。
方法3:defaultdictを使う
defaultdictはPython標準ライブラリのcollectionsモジュールに含まれるコンテナです。コンストラクタに「デフォルトファクトリ(デフォルト値を生成する関数)」を渡して初期化します。存在しないキーへアクセスすると、このファクトリが生成したデフォルト値が自動的に返されます。
キーが存在しない場合の処理を都度記述する必要がないため、多数のキーアクセスを行う場面では効率的な手法といえます。
サンプルコード
import collections as col # デフォルトファクトリに「キーが存在しません」という文字列を返す関数を設定 country_dict = col.defaultdict(lambda: 'Key Not Present') country_dict['India'] = 'IN' country_dict['Australia'] = 'AU' country_dict['Brazil'] = 'BR' print(country_dict['Australia']) print(country_dict['Canada'])
実行結果
AU Key Not Present
ここではラムダ式lambda: 'Key Not Present'をデフォルトファクトリとして指定しています。未登録の'Canada'にアクセスしても、エラーではなく指定した文字列が返されることが確認できます。
まとめ:使い分けのポイント
| 手法 | 特徴 |
|---|---|
d[key](通常アクセス) | キーがないとKeyErrorが発生する |
get() | キーがなければデフォルト値を返す(辞書は変更されない) |
setdefault() | キーがなければデフォルト値を返し、かつ辞書に追加する |
defaultdict | デフォルト値の生成ルールを事前に定義できる |
単に値を取得したいだけならget()、存在しないキーをあらかじめ登録しておきたいならsetdefault()、同一種類のオブジェクトを大量に格納する場合はdefaultdictを使うのがおすすめです。状況に応じて適切な手法を選び、堅牢で読みやすいコードを目指しましょう。
-
Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例
Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実
-
Pythonの辞書(dict)の使い方を徹底解説!作成・取得・追加・削除の基本
辞書(Dictionary)は、Pythonで最もよく使われるマッピング型です。キーと値のペアでデータを管理できるため、JavaのMapに似たオブジェクトだと言えます。 Pythonでは、波括弧 {} を使って辞書リテラルを作成します。キーと値はコロン : で結び、各ペアはカンマ , で区切ります。 辞書の作成方法 まずは、基本的な辞書の作成例を見てみましょう。 datedict = { date: 13, month: January, year: 1970 } print(datedict) 実行結果: {date: 13, month: January, year: 197