Pythonでdefaultdictを使う(collections.defaultdict)
この記事では、Pythonのcollectionsモジュールにあるdefaultdictについて、その使用方法と利点を解説します。特に辞書型のデータ構造を扱う際に役立つdefaultdictの使い方を、具体的なコード例とともに説明します。
目次
defaultdictとは?
collections.defaultdictは、通常のdictと同様にキーと値のペアを保存するデータ構造ですが、キーが存在しない場合にデフォルト値を自動的に生成する点が異なります。これにより、キーの存在チェックを明示的に行う必要がなくなり、コードを簡潔で読みやすくすることができます。
from collections import defaultdict
# int型のデフォルト値を持つdefaultdictを作成
my_dict = defaultdict(int)
# キーが存在しない場合、デフォルト値0が自動的に生成される
my_dict['a'] += 1
my_dict['b'] += 2
print(my_dict) # 出力: defaultdict(<class 'int'>, {'a': 1, 'b': 2})
上記の例では、int型をデフォルト値として指定しています。デフォルト値には、int、str、list、set、dictなど、任意の型を指定できます。
defaultdictの使いかた
defaultdictを使うと、キーの存在チェックをせずに値を追加することができます。通常のdictでは、キーが存在しない場合にKeyErrorが発生しますが、defaultdictではデフォルト値が生成されるため、エラーが発生しません。
from collections import defaultdict
# list型のデフォルト値を持つdefaultdictを作成
my_dict = defaultdict(list)
my_dict['a'].append(1)
my_dict['a'].append(2)
my_dict['b'].append(3)
print(my_dict) # 出力: defaultdict(<class 'list'>, {'a': [1, 2], 'b': [3]})
リストだけでなく、他のデータ構造をデフォルト値として使うことも可能です。
defaultdictと通常のdictの違い
通常のdictとdefaultdictの最も大きな違いは、キーが存在しない場合の挙動です。通常のdictではKeyErrorが発生しますが、defaultdictではデフォルト値が自動的に生成されます。この違いにより、defaultdictはデータの集計や処理を簡潔に記述できるため、多くの場面で便利です。
from collections import defaultdict
# 通常のdict
my_dict = {}
try:
my_dict['a'] += 1
except KeyError:
my_dict['a'] = 1
# defaultdict
my_defaultdict = defaultdict(int)
my_defaultdict['a'] += 1
print(my_dict) # 出力: {'a': 1}
print(my_defaultdict) # 出力: defaultdict(<class 'int'>, {'a': 1})
よくある例:カウンターの作成
defaultdictは、単語の出現回数を数えるカウンターを作成する際に非常に便利です。
from collections import defaultdict
text = "apple banana apple orange banana apple"
word_counts = defaultdict(int)
for word in text.split():
word_counts[word] += 1
print(word_counts) # 出力: defaultdict(<class 'int'>, {'apple': 3, 'banana': 2, 'orange': 1})
まとめ
defaultdictは、キーが存在しない場合にデフォルト値を自動的に生成する便利なデータ構造です。特に、データの集計や処理を行う際に、コードを簡潔で読みやすくすることができます。様々なデフォルト値を指定できるので、柔軟に利用できます。
関連記事
- Pythonで辞書に要素を追加・更新(update, 辞書[key] = value)
- Pythonで辞書から要素を削除(pop, popitem, del)
- Pythonで辞書のキー・値を取得(keys, values, items)
- Pythonで辞書のキーの存在を確認(in演算子, get)
- Pythonで辞書をループ処理(for key in dict, for key, value in dict.items())
- Pythonで辞書を作成(dict, 辞書内包表記)
- Pythonで辞書を結合(update, {**dict1, **dict2} (Python 3.5以降))
- Pythonで辞書をフィルタリング(辞書内包表記)
- Pythonで辞書をコピー(copy, deepcopy)
- Pythonで辞書をJSONに変換(json.dumps)