Python
備忘録

Pythonでdictからデフォルト値指定をしつつ値を取得する

More than 1 year has passed since last update.

すぐ忘れちゃうのでメモ。

dict インスタンスからキーを指定して値を取り出すときに、

  • もしかしたらこの辞書にはこのキーが設定されない場合があるかも、とか
  • KeyError は撲滅しておきたいな、とか

思ったら get メソッドを利用するのが吉。

>>> d = {"a": 1, "b": 2} 

>>> d["c"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'

>>> d.get("c") # default を指定しないと None が返る

>>> d.get("c", 3) # default を指定すればその値が返る
3

>>> 

うれしいのは get(key[, default]) とデフォルト値を指定できるようになっていること。
なので、以下のようなものはすべて get ですんなり書ける。

>>> c = d["c"] if "c" in d else 3
>>> c
3

>>> c = d["c"] if d.has_key("c") else 3
>>> c
3

# 上のやつらは get の default 指定ですっきり書ける
>>> c = d.get("c", 3)
>>> c
3

さらに、 きれいに書くために defaultdict を import していた以下のような処理も get で書ける。
が、 defaultdict 使った方がよりきれいに書けるので可読性あげたいときは defaultdict 使うべき。

>>> from collections import defaultdict
>>> dd = defaultdict(int, d)
>>> dd
defaultdict(<type 'int'>, {'a': 1, 'b': 2})

>>> dd["c"] += 1  # 存在しないキーに +=1 をしてもエラーにならず int のデフォルト値0の設定が暗黙的に行われる
>>> dd["c"]
1

# get を使えば defaultdict を使わなくても書ける
>>> d  
{'a': 1, 'b': 2}

>>> d["c"] = d.get("c", 0) + 1 # 存在しないキーからデフォルト値0を取得して +1 する
>>> d["c"]
1