すぐ忘れちゃうのでメモ。
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