Pythonには、リスト内包表記と同様に、辞書(dict)を簡潔に生成・加工するための**「辞書内包表記(Dictionary Comprehension)」**という機能があります。
通常の for ループを使って辞書を作成する場合と比較して、コードの記述量が減り、可読性が向上します。また、処理速度の面でも有利になる場合があります。
この記事では、辞書内包表記の基本構文と、実用的な4つの使用パターンについて解説します。
辞書内包表記の基本構文
辞書内包表記は、{}(波括弧)の中に、キーと値のペアを生成する式と for 文を記述します。
構文:
{キーの式: 値の式 for 変数 in イテラブル}
パターン1:リストから辞書を生成する
最も基本的な使い方は、リストなどのイテラブルからキーを取り出し、特定の値(固定値や計算結果)を割り当てて辞書を作成する方法です。
例として、サーバー名のリストから、全てのステータスを初期値 “Active” に設定した辞書を作成します。
# サーバー名のリスト
server_list = ["web-01", "db-01", "cache-01"]
# 辞書内包表記で初期化
# キーはサーバー名、値はすべて "Active"
server_status = {server: "Active" for server in server_list}
print(f"サーバーステータス: {server_status}")
実行結果:
サーバーステータス: {'web-01': 'Active', 'db-01': 'Active', 'cache-01': 'Active'}
パターン2:既存の辞書を加工する (.items() の利用)
既存の辞書の「値」を一括で変更して、新しい辞書を作成する場合にも役立ちます。この場合、元の辞書の .items() メソッドを使ってキーと値を取り出します。
例として、商品の税抜価格が格納された辞書から、税込価格(1.1倍)の辞書を作成します。
# 税抜価格の辞書
prices_excluding_tax = {
"Mouse": 2000,
"Keyboard": 5000,
"Monitor": 30000
}
# 値を1.1倍にして新しい辞書を作成
# キー(item)はそのまま、値(price)を計算
prices_including_tax = {item: int(price * 1.1) for item, price in prices_excluding_tax.items()}
print(f"税込価格: {prices_including_tax}")
実行結果:
税込価格: {'Mouse': 2200, 'Keyboard': 5500, 'Monitor': 33000}
パターン3:条件付きで辞書を作成する (if の利用)
for 文の後に if 文を追加することで、特定の条件を満たす要素だけを抽出して辞書を作成できます(フィルタリング)。
例として、全科目のスコア辞書から、合格ライン(60点以上)の科目だけを抽出します。
# 全科目のスコア
all_scores = {
"Math": 85,
"Science": 92,
"History": 58,
"English": 45
}
# 60点以上の科目のみ抽出
passing_scores = {subject: score for subject, score in all_scores.items() if score >= 60}
print(f"合格科目: {passing_scores}")
実行結果:
合格科目: {'Math': 85, 'Science': 92}
パターン4:2つのリストから辞書を作成する (zip の利用)
「キーのリスト」と「値のリスト」が別々に存在する場合、zip() 関数と辞書内包表記を組み合わせることで、それらを結合して一つの辞書にできます。
# IDのリスト (キー)
user_ids = [101, 102, 103]
# 名前のリスト (値)
user_names = ["Tanaka", "Sato", "Suzuki"]
# zipでまとめて辞書化
user_directory = {uid: name for uid, name in zip(user_ids, user_names)}
print(f"ユーザーディレクトリ: {user_directory}")
実行結果:
ユーザーディレクトリ: {101: 'Tanaka', 102: 'Sato', 103: 'Suzuki'}
補足: 単純に結合するだけであれば、
dict(zip(user_ids, user_names))と書くこともできますが、キーや値を加工したい場合(例:IDを文字列に変換するなど)は辞書内包表記が適しています。
まとめ
- 辞書内包表記は
{key: value for var in iterable}の形式で記述します。 forループでdict[key] = valueを繰り返すよりも簡潔に記述できます。.items()と組み合わせることで、既存の辞書の値の一括変換が可能です。ifを組み合わせることで、辞書のフィルタリングが可能です。zip()と組み合わせることで、2つのリストを辞書に結合できます。
