存在しないkeyを取得すると

dict型では存在しないkeyを取得しようとするとエラーが起きてしまう。

まず初めに実際に取得しようとしてみよう。

a = {"a" : 1, "b" : 2}
print(a["c"])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[4], line 2
      1 a = {"a" : 1, "b" : 2}
----> 2 print(a["c"])

KeyError: 'c'

KeyError例外が出た。今回はこれの対処方法を三つ紹介しようと思う。

try-except

dict型の存在しないkeyで値を取得する可能性がある際に、対処する方法を二つ紹介する。

一つ目は、最も一般的な方法であるtry-except文を使用する方法である。

実際に、try-except文を使用して存在しないkeyを取得しようとしてみる。

a = {"a" : 1, "b" : 2}
try:
    print(a["c"])
except KeyError:
    print("KeyErrorです")
KeyErrorです

しっかりtry-except文を使用することで、対処をすることが出来た。

dict.get()

二つ目の対処方法は、dict.getメソッドを使う方法である。

dict.getメソッドを使うことで、keyが存在しない場合に対処できることが出来る。

a = {"a" : 1, "b" : 2}
print(a.get("c"))
None

存在しないkeyを取得しようとすると、Noneが返された。

また、dict.getメソッドの引数にはdefaultというものがあり、それを指定することで、存在しないkeyを取得しようとした際に返される値を変更することが出来る。

ちなみに、default引数の初期値はNoneのため先程はNoneが返されていた。

a = {"a" : 1, "b" : 2}
print(a.get("c", -1))
-1

default引数に-1を入れたので、存在しないkeyを取得した際に-1が返されていることが確認できた。

defaultdict

最後に、そもそもdict型を使用しないという解決手段が存在する。

標準ライブラリにあるcollectionsには、defaultdictというデータ型が存在する。

from collections import defaultdict

defaultdictは、インスタンス化の際に初期化を関数ですることが可能である。

今回は、例として分かりやすくするため無名関数を使用しないが、実際は無名関数を使用したほうが良いと思う。

def func():
    return "Hello"

a = defaultdict(func)
a["a"] = 1
a["b"] = 2
print(a["a"])
print(a["b"])
print(a["c"])
1
2
Hello

また、当たり前ではあるがint型などデータ型のコンストラクタを利用することも可能である。

a = defaultdict(list)
a["a"] = [1, 2, 3]
a["b"].append(4)
print(a["a"])
print(a["b"])
print(a["c"])
[1, 2, 3]
[4]
[]

参考

公式ドキュメント(defaultdict)
https://docs.python.org/ja/3.13/library/collections.html#collections.defaultdict

Pythonの辞書のgetメソッドでキーから値を取得(存在しないキーでもOK)
https://note.nkmk.me/python-dict-get/