Traffine I/O

日本語

2023-03-31

Pythonのdefaultdict

defaultdictとは

defaultdictは、Pythonのcollectionsモジュールで利用可能な特殊な辞書です。組み込みのdictクラスを拡張し、キーが見つからない場合の処理を簡素化することで、デフォルト値を提供します。キーが見つからないときにKeyErrorを発生させる代わりに、defaultdictはデフォルトファクトリーと呼ばれる関数で指定されたデフォルト値を持つキーを自動的に作成します。

デフォルトファクトリーの理解

組み込み関数をデフォルトファクトリーとして使用

デフォルトファクトリーは、引数を取らず値を返す任意の呼び出し可能オブジェクトです。Pythonには、listintsetなどのデフォルトファクトリーとして使用できるいくつかの組み込み関数が提供されています。これらの関数は、それぞれ空のリスト、ゼロに初期化された整数、空の集合を作成します。

カスタムデフォルトファクトリーの作成

独自の関数を定義するか、lambda式を使用してカスタムデフォルトファクトリーを作成することもできます。これにより、デフォルト値を特定のユースケースに合わせてカスタマイズできます。

defaultdictの作成

defaultdictクラスのインポート

defaultdictを使用するには、collectionsモジュールからインポートする必要があります。

python
from collections import defaultdict

defaultdictの初期化

インポートしたら、デフォルトファクトリーを引数として渡してdefaultdictを作成できます。

python
dd = defaultdict(list)

defaultdictの一般的な使用例

要素のカウント

intデフォルトファクトリーを持つdefaultdictは、シーケンス内の要素の出現回数を数えるのに有効です。

python
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
word_counts = defaultdict(int)

for word in words:
    word_counts[word] += 1

要素のグルーピング

listデフォルトファクトリーを持つdefaultdictは、特定の属性に基づいて要素をグループ化するために使用できます。

python
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:

python
nested_dd = defaultdict(lambda: defaultdict(int))

defaultdictの組み合わせ

同じデフォルトファクトリーを持つ2つのdefaultdictを統合するには、ループを使用して値を更新できます。

python
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を作成できます。

python
# Create a defaultdict with a default value of 1
dd = defaultdict(lambda: 1)

defaultdictとdictの比較

主要な違い

defaultdictとdictの主な違いは、キーが見つからないときの動作です。defaultdictはデフォルト値を持つキーを自動的に作成しますが、dictはKeyErrorを発生させます。

パフォーマンスへの影響

辞書を操作する際にキーの存在確認や例外処理を明示的に行う必要がないため、defaultdictを使用することでコードのパフォーマンスが向上する可能性があります。

参考

https://www.geeksforgeeks.org/defaultdict-in-python/
https://docs.python.org/3/library/collections.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!