Pythonには、標準で様々なデータ型が用意されていますが、時にはそれだけでは不十分な場合もあります。そのような場合に便利なのが、collectionsモジュールです。このモジュールには、Python標準のデータ型を拡張したり、新しいデータ型を提供してくれます。
defaultdictの特徴と使い方
defaultdictは、辞書型(dict)のサブクラスで、キーが存在しない場合に自動的に初期値を設定してくれます。例えば、下記のように初期値を設定することができます。
from collections import defaultdict d = defaultdict(int) print(d["a"]) # 0 print(d["b"]) # 0
defaultdictは、引数に初期値を取ることができます。上記の例では、int型の0が初期値となっていますが、他の型を初期値として指定することもできます。
dictの特徴と使い方
dictは、キーと値のペアを保持するデータ型です。キーはハッシュ可能なオブジェクトである必要があります。dictを使うことで、キーを指定するだけで値を取得することができます。
d = {"a": 1, "b": 2, "c": 3} print(d["a"]) # 1 print(d["b"]) # 2
dictは、キーが存在しない場合にはKeyErrorが発生します。また、順序が保証されていません。
ordereddictの特徴と使い方
ordereddictは、dictのサブクラスで、要素の順序が保証されています。つまり、要素を追加した順序で要素が格納されます。例えば、下記のように使うことができます。
from collections import OrderedDict d = OrderedDict() d["a"] = 1 d["b"] = 2 d["c"] = 3 print(d) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
ordereddictは、Python3.7以降では、dict自体が順序を保証するようになったため、あまり使われなくなっています。ただし、Python3.6以前では、順序が保証された辞書を使いたい場合には、ordereddictを使う必要があります。
defaultdictとdictの違い
defaultdictとdictの最大の違いは、キーが存在しない場合に初期値を設定するかどうかです。例えば、下記のように、キーが存在しない場合に初期値を設定しない場合は、dictを使います。
d = {"a": 1, "b": 2} print(d["c"]) # KeyError dd = defaultdict(int) print(dd["c"]) # 0
また、defaultdictには、dictにはない便利なメソッドがあります。例えば、下記のように、キーが存在するかどうかを確認せずに、値を増やすことができます。
from collections import defaultdict d = defaultdict(int) d["a"] += 1 print(d) # defaultdict(<class 'int'>, {'a': 1})
defaultdictとordereddictの違い
defaultdictとordereddictの最大の違いは、要素の順序が保証されるかどうかです。defaultdictは、要素の順序を保証しませんが、ordereddictは、要素の順序が保証されます。例えば、下記のように、要素を追加した順序で要素が格納されることがわかります。
from collections import defaultdict, OrderedDict dd = defaultdict(int) dd["a"] = 1 dd["b"] = 2 dd["c"] = 3 print(dd) # defaultdict(<class 'int'>, {'a': 1, 'b': 2, 'c': 3}) do = OrderedDict() do["a"] = 1 do["b"] = 2 do["c"] = 3 print(do) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
まとめ
Pythonのcollectionsモジュールには、様々な便利なデータ型が用意されています。defaultdictは、キーが存在しない場合に初期値を設定してくれる辞書型、dictは、キーと値のペアを保持する辞書型、ordereddictは、要素の順序が保証された辞書型です。それぞれの違いを理解して、適切に使い分けることが重要です。