defaultdictとは
defaultdictは、Pythonのcollectionsモジュールで利用可能な特殊な辞書です。組み込みのdict
クラスを拡張し、キーが見つからない場合の処理を簡素化することで、デフォルト値を提供します。キーが見つからないときにKeyErrorを発生させる代わりに、defaultdictはデフォルトファクトリーと呼ばれる関数で指定されたデフォルト値を持つキーを自動的に作成します。
デフォルトファクトリーの理解
組み込み関数をデフォルトファクトリーとして使用
デフォルトファクトリーは、引数を取らず値を返す任意の呼び出し可能オブジェクトです。Pythonには、list
、int
、set
などのデフォルトファクトリーとして使用できるいくつかの組み込み関数が提供されています。これらの関数は、それぞれ空のリスト、ゼロに初期化された整数、空の集合を作成します。
カスタムデフォルトファクトリーの作成
独自の関数を定義するか、lambda式を使用してカスタムデフォルトファクトリーを作成することもできます。これにより、デフォルト値を特定のユースケースに合わせてカスタマイズできます。
defaultdictの作成
defaultdictクラスのインポート
defaultdictを使用するには、collections
モジュールからインポートする必要があります。
from collections import defaultdict
defaultdictの初期化
インポートしたら、デフォルトファクトリーを引数として渡してdefaultdictを作成できます。
dd = defaultdict(list)
defaultdictの一般的な使用例
要素のカウント
int
デフォルトファクトリーを持つdefaultdictは、シーケンス内の要素の出現回数を数えるのに有効です。
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
word_counts = defaultdict(int)
for word in words:
word_counts[word] += 1
要素のグルーピング
list
デフォルトファクトリーを持つdefaultdictは、特定の属性に基づいて要素をグループ化するために使用できます。
students = [
{"name": "Alice", "age": 24},
{"name": "Bob", "age": 22},
{"name": "Charlie", "age": 24},
{"name": "David", "age": 22},
]
students_by_age = defaultdict(list)
for student in students:
students_by_age[student["age"]].append(student)
Nested defaultdicts
You can use nested defaultdicts to create multi-level dictionaries with default values at each level:
nested_dd = defaultdict(lambda: defaultdict(int))
defaultdictの組み合わせ
同じデフォルトファクトリーを持つ2つのdefaultdictを統合するには、ループを使用して値を更新できます。
dd1 = defaultdict(int, {"a": 1, "b": 2})
dd2 = defaultdict(int, {"b": 3, "c": 4})
for key, value in dd2.items():
dd1[key] += value
lambda関数を使ったdefaultdict
デフォルトファクトリーとしてlambda関数を使用することで、より柔軟なdefaultdictを作成できます。
# Create a defaultdict with a default value of 1
dd = defaultdict(lambda: 1)
defaultdictとdictの比較
主要な違い
defaultdictとdict
の主な違いは、キーが見つからないときの動作です。defaultdictはデフォルト値を持つキーを自動的に作成しますが、dict
はKeyErrorを発生させます。
パフォーマンスへの影響
辞書を操作する際にキーの存在確認や例外処理を明示的に行う必要がないため、defaultdictを使用することでコードのパフォーマンスが向上する可能性があります。
参考