Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
collections.defaultdict()
『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 | デフォルト値を生成する関数(コンストラクタ引数)を保持する属性です。 |
サンプルコード
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) でカウントします。
words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
word_count = defaultdict(int)
for word in words:
word_count[word] += 1 # 存在しないキーは 0 から始まります。
print(dict(word_count))
# 『{'apple': 3, 'banana': 2, 'cherry': 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 で任意のデフォルト値を設定します。
prices = defaultdict(lambda: 9999) # 未登録商品の価格は 9999 円
prices['apple'] = 120
print(prices['apple']) # 『120』と出力されます。
print(prices['grape']) # 未登録のため『9999』と出力されます。
# default_factory を確認します。
d = defaultdict(list)
print(d.default_factory) # 『<class 'list'>』と出力されます。
概要
『defaultdict』は通常の辞書と同様に使えますが、存在しないキーにアクセスした際に KeyError を発生させず、自動でデフォルト値を生成してそのキーに設定する点が異なります。これにより「キーが存在するか確認してから処理する」というボイラープレートコードが不要になります。
『defaultdict(int)』によるカウント処理は『Counter』と同様のことができますが、集計以外の複雑な処理を組み合わせる場合は『defaultdict』の方が柔軟です。単純なカウントであれば『Counter』の方がコードが簡潔になります。
『defaultdict』でデフォルト値が生成されると、そのキーが辞書に追加されます。単にデフォルト値を返すだけでキーを追加したくない場合は、通常の辞書の『get()』メソッドや『setdefault()』を使ってください。
要素のカウントは『collections.Counter()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。