2015/05/07

Python Tips:辞書にアイテムが存在しない場合のデフォルト値を設定したい

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

参考
dict.get — Python 公式ドキュメント
collections.defaultdict — Python 公式ドキュメント

0 件のコメント: