Python で辞書にアイテムが存在しない場合のデフォルト値の設定方法をご紹介します。
Python の辞書を使っていると、次のような処理をしたくなるときがあるかと思います。
# 各朝食メニューの回数を調べる
breakfast = ['kome', 'pan', 'kome', 'kome', 'cereal', 'pan', 'kome']
numbers = dict()
for b in breakfast:
if b in numbers:
numbers[b] += 1
else:
numbers[b] = 1
print(numbers)
# => {'pan': 2, 'kome': 4, 'cereal': 1}
この処理はもちろん間違っていませんが、もっとシンプルにわかりやすく書きたい場合はデフォルト値を使うのが便利です。デフォルト値を使うにはいくつかの方法があります。 2 つの方法を以下にご紹介します。
方法その 1. get
メソッドを使う方法
辞書の get
メソッドを使うと上記の for
ループは次のようにコンパクトに書き換えることができます。
for b in breakfast:
numbers[b] = numbers.get(b, 0) + 1
get
メソッドは、第 1 引数に取得したいアイテムのキーを、第 2 引数にそのアイテムが見つからなかった場合のデフォルト値を受け取ります。アイテムが見つかった場合の戻り値はブラケットシンタックス( []
)のものと同じです。
方法その 2. defaultdict
もうひとつの方法は、その名も defaultdict
というデフォルト値つきの辞書型を利用する方法です。 defaultdict
は組み込みの collections
ライブラリに含まれています。 defaultdict
を使うと上記のコードは次のように書き換えることができます。
# 各朝食メニューの回数を調べる
from collections import defaultdict
breakfast = ['kome', 'pan', 'kome', 'kome', 'cereal', 'pan', 'kome']
numbers = defaultdict(lambda: 0)
for b in breakfast:
numbers[b] += 1
print(dict(numbers))
# => {'pan': 2, 'kome': 4, 'cereal': 1}
defaultdict
を生成する際に関数やクラスなど callable なオブジェクトを渡すと、キーが見つからなかった場合にそのオブジェクトが呼び出されます。 numbers = defaultdict(lambda: 0)
の行は次のように書き換えることも可能です。
numbers = defaultdict()
numbers.default_factory = lambda: 0