Pythonのcollections  defaultdict, ordereddict, dictの違い

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は、要素の順序が保証された辞書型です。それぞれの違いを理解して、適切に使い分けることが重要です。