TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

辞書型のKeyErrorを回避する

皆さん
こんにちは、こんばんは
TomoProgです。

久しぶりにブログ書こうと思います。

今回はPythonの辞書型を使っていると遭遇するKeyErrorについて少し調べてみました。
それでは頑張っていきましょう。

辞書型って何?

KeyErrorの前にまずは辞書型について少し書いておきます。
辞書型とは任意のキーに対して値を持てる型のことです。
他の言語でハッシュマップや連想配列という言葉を聞いたことがある人はそれとほぼ同じ型だと思います。

辞書型を使う場合は波括弧を使って「'キー':'値'」の形で表現します。

#-*- coding:utf-8 -*-

def main():
    person_dict = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(person_dict['name'])
    print(person_dict['age'])
    print(person_dict['blood'])

if __name__ == "__main__":
    main()
実行結果:
tomoprog
24
A

person_dictという変数に辞書型を定義し、「変数名['Key']」で定義した辞書型の値にアクセスしています。
ちなみに辞書型の値は数値でも文字列でも構いません。

KeyErrorを出力してみる

それでは今回の本題に入っていきましょう。
まずはKeyErrorを実際に起こしてみます。

とは言っても引き起こすのは簡単で、存在しないキーで辞書にアクセスするだけです。
実際にKeyErrorを引き起こしたコードがコチラ

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(d['name'])
    print(d['age'])
    print(d['blood'])
    print(d['height'])

if __name__ == "__main__":
    main()
実行結果:
tomoprog
24
A
Traceback (most recent call last):
  File "dict.py", line 11, in <module>
    main()
  File "dict.py", line 8, in main
    print(d['height'])
KeyError: 'height'

heightという存在しないキーで辞書にアクセスしたためKeyErrorが出力されています。

KeyErrorを回避する

KeyErrorが出力されると強制的にプログラムが終了してしまいます。
強制的に終了されては困る場合はこのKeyErrorを対処しないといけません。

対処する方法としては

  1. 辞書にキーが存在するかを確認してからアクセスする
  2. try-exceptを実装する

この2つの方法が考えられます。

実際に2つの方法で対処してみましょう。

辞書にキーが存在するかを確認してからアクセスする

キーを確認してからアクセスする場合はinまたはgetを使用します。
inを使う場合はもし、キーが辞書にあればというif文を書くことでKeyErrorを回避できます。

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}

    if 'age' in d:
        print(d['age'])
    else:
        print("d do not have 'age' key")

    if 'height' in d:
        print(d['height'])
    else:
        print("d do not have 'height' key")

if __name__ == "__main__":
    main()
実行結果:
24
d do not have 'height' key

getを使う場合は辞書型.get()メソッドを使用します。
存在する場合は第1引数、存在しない場合は第2引数を返します。

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(d.get('name', None))
    print(d.get('height', None))

if __name__ == "__main__":
    main()
実行結果:
tomoprog
None

どちらかと言えばgetを使うほうがif文が必要ない分綺麗に書けそうです。

try-exceptを実装する

try-exceptを使用する場合はKeyErrorが出力される部分をtryで囲み、exceptでKeyErrorを捕捉します。

#-*- coding:utf-8 -*-

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    try:
        print(d['height'])
    except KeyError:
        print("KeyError Exception.")

if __name__ == "__main__":
    main()
実行結果:
KeyError Exception.

try-exceptが実装されることで、KeyErrorが出力されたときも強制終了することなく実行できます。

まとめ

今回は辞書型のKeyErrorの回避方法として、いくつか例を上げてみました。
個人的にはgetを使う方法が一番綺麗に簡潔に書けるので好きです。
KeyErrorで詰まった時は是非参考にしてみてください。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter