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





