Pythonの辞書内包表記:辞書を効率的かつ簡潔に作成・操作する方法

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つのリストを辞書に結合できます。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次