collections.defaultdict()
| 対応: | Python 3.0(2008) |
|---|
『defaultdict』はキーが存在しない場合に自動でデフォルト値を生成する辞書のサブクラスです。『KeyError』を気にせずにデータを集計・グルーピングするコードが書けます。
構文
from collections import defaultdict # デフォルト値の型を指定して生成します。 d = defaultdict(list) # 存在しないキーに空のリストを生成します。 d = defaultdict(int) # 存在しないキーに 0 を生成します。 d = defaultdict(set) # 存在しないキーに空のセットを生成します。 d = defaultdict(str) # 存在しないキーに空文字列を生成します。 d = defaultdict(lambda: デフォルト値) # 任意のデフォルト値を指定します。 # 存在しないキーにアクセスすると自動でデフォルト値が生成されます。 d['新しいキー'].append(値) # KeyError が発生しません。
コンストラクタ引数と属性一覧
| 引数 / 属性 | 概要 |
|---|---|
| defaultdict(list) | 存在しないキーへのアクセス時に空のリスト『[]』をデフォルト値として生成します。グルーピング処理に使います。 |
| defaultdict(int) | 存在しないキーへのアクセス時に整数の『0』をデフォルト値として生成します。カウント処理に使います。 |
| defaultdict(set) | 存在しないキーへのアクセス時に空のセット『set()』をデフォルト値として生成します。重複を除いた集合の管理に使います。 |
| defaultdict(lambda: 値) | ラムダ式で任意のデフォルト値を指定します。0以外の数値や文字列をデフォルトにしたい場合に使います。 |
| d.default_factory | デフォルト値を生成する関数(コンストラクタ引数)を保持する属性です。 |
サンプルコード
sample_collections_defaultdict.py
from collections import defaultdict
# defaultdict(list) でグルーピングします。
students = [('狡噛慎也', '刑事'), ('常守朱', '法学'), ('狡噛慎也', '格闘'), ('常守朱', '刑事')]
by_student = defaultdict(list)
for name, subject in students:
by_student[name].append(subject) # 存在しないキーでも KeyError なし。
print(dict(by_student))
# 『{'狡噛慎也': ['刑事', '格闘'], '常守朱': ['法学', '刑事']}』と出力されます。
# 通常の辞書では事前の初期化が必要です(比較)。
by_student_normal = {}
for name, subject in students:
if name not in by_student_normal:
by_student_normal[name] = []
by_student_normal[name].append(subject)
# defaultdict(int) でカウントします。
names = ['Kogami', 'Tsunemori', 'Kogami', 'Ginoza', 'Tsunemori', 'Kogami']
name_count = defaultdict(int)
for name in names:
name_count[name] += 1 # 存在しないキーは 0 から始まります。
print(dict(name_count))
# 『{'Kogami': 3, 'Tsunemori': 2, 'Ginoza': 1}』と出力されます。
# defaultdict(set) で重複なしのグルーピング
visits = [('狡噛慎也', 'Tokyo'), ('常守朱', 'Osaka'), ('狡噛慎也', 'Tokyo'), ('狡噛慎也', 'Kyoto')]
visited = defaultdict(set)
for name, city in visits:
visited[name].add(city) # 重複は自動で除外されます。
print(dict(visited))
# 『{'狡噛慎也': {'Tokyo', 'Kyoto'}, '常守朱': {'Osaka'}}』と出力されます。
# lambda で任意のデフォルト値を設定します。
scores = defaultdict(lambda: 9999) # 未登録キャラのスコアは 9999
scores['狡噛慎也'] = 120
print(scores['狡噛慎也']) # 『120』と出力されます。
print(scores['槙島聖護']) # 未登録のため『9999』と出力されます。
# default_factory を確認します。
d = defaultdict(list)
print(d.default_factory) # 『<class 'list'>』と出力されます。
python3 collections_defaultdict.py
{'狡噛慎也': ['刑事', '格闘'], '常守朱': ['法学', '刑事']}
{'Kogami': 3, 'Tsunemori': 2, 'Ginoza': 1}
{'狡噛慎也': {'Kyoto', 'Tokyo'}, '常守朱': {'Osaka'}}
120
9999
<class 'list'>
概要
『defaultdict』は通常の辞書と同様に使えますが、存在しないキーにアクセスした際に『KeyError』を発生させず、自動でデフォルト値を生成してそのキーに設定する点が異なります。これにより「キーが存在するか確認してから処理する」というボイラープレートコードが不要になります。
『defaultdict(int)』によるカウント処理は『Counter』と同様のことができますが、集計以外の複雑な処理を組み合わせる場合は『defaultdict』の方が柔軟です。単純なカウントであれば『Counter』の方がコードが簡潔になります。
『defaultdict』でデフォルト値が生成されると、そのキーが辞書に追加されます。単にデフォルト値を返すだけでキーを追加したくない場合は、通常の辞書の『get()』メソッドや『setdefault()』を使ってください。
要素のカウントは『collections.Counter()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。