概要(辞書内包表記は「キーと値を同時に作る」を一行で)
辞書内包表記は、for と if を“内側”に書いて、新しい辞書を一行で作る記法です。基本は「{キー式: 値式 for 変数 in イテラブル}」。必要なら最後に「if 条件」を付けて、項目を選びながら作れます。リスト内包表記との違いは「キーと値(ペア)を同時に設計する」点です。
# 基本形:{キー式: 値式 for 変数 in イテラブル}
squares = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Python基本構文と考え方(ここが重要)
キー式・値式・反復(for)・選別(if)
辞書内包表記は「どのキーに、どんな値を入れるか」を、見たままに書けます。キー式と値式は任意の式で、複雑になりそうなら関数化して読みやすく保ちます。末尾の if は「辞書に含めるかどうか」を決めるフィルタです。
# 偶数だけ登録し、値は2乗
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
Python既存の辞書を“変換”する(.items を使う)
既存の辞書を加工するなら items() で「キーと値」を取り出し、それぞれを変換して新しい辞書を作ります。
prices = {"coffee": 350, "tea": 280}
with_tax = {name: round(price * 1.1) for name, price in prices.items()}
# {'coffee': 385, 'tea': 308}
Python2つのイテラブルから辞書を作る(zip を使う)
キーと値が別々のリストにあるなら zip でペアにして辞書化します。長さが異なる場合は短い方に揃って止まる点に注意。
names = ["Alice", "Bob", "Charlie"]
scores = [90, 85, 92]
record = {name: score for name, score in zip(names, scores)}
# {'Alice': 90, 'Bob': 85, 'Charlie': 92}
Pythonよく使うパターン(ID付け・正規化・フィルタ・入れ替え)
キーの生成規則を与える(連番・フォーマット)
「連番キー」「プレフィックス付きキー」など、キーを計算して作れます。
users = ["taro", "hanako", "jiro"]
indexed = {f"user_{i}": name for i, name in enumerate(users, start=1)}
# {'user_1': 'taro', 'user_2': 'hanako', 'user_3': 'jiro'}
Python前処理+辞書化(正規化してから登録)
トリム・大小変換などの前処理をかけてから辞書へ。
raw = [" Apples ", "TEA", " coffees"]
norm = {s.strip().lower(): len(s.strip()) for s in raw}
# {'apples': 7, 'tea': 3, 'coffees': 8}
Python条件でフィルタしつつ辞書化
「必要なものだけ登録」も一行で書けます。
products = [("coffee", 350), ("tea", 280), ("juice", 220)]
expensive = {name: price for name, price in products if price >= 300}
# {'coffee': 350}
Pythonキーと値の“反転”(重複値への対策も)
値がユニークなら真っ直ぐ反転できます。重複値がある場合はリストで受ける設計に。
d = {"A": 1, "B": 2, "C": 1}
# 重複に対応する反転
inv = {v: [k for k, vv in d.items() if vv == v] for v in set(d.values())}
# {1: ['A', 'C'], 2: ['B']}
Python重要ポイントの深掘り(キーの一意性・可読性・性能)
キーの衝突は“最後の値で上書き”
同じキーが複数回生成されると、後から来た値で上書きされます。意図的に集約したいなら、リストやカウンタを使う設計へ切り替えましょう。
pairs = [("A", 1), ("A", 2)]
result = {k: v for k, v in pairs}
# {'A': 2}(最後が有効)
Python「条件分岐が増えたら」内包表記をやめる判断
辞書内包表記は“変換+1条件”程度が読みやすい上限。分岐が複雑・長くなるなら通常の for と if、または関数化して式を短く保ちます。
計算量とメモリ
辞書内包表記は要素数に比例して O(n)。C実装により高速ですが、全件をメモリに載せるため、巨大データではイテレータで段階処理(生成した辞書をすぐ使って捨てる)か、必要範囲で分割処理を検討します。
実践例で身につける(定番から一歩先まで)
例題1:JSON風データから「必要フィールドだけ」抜き出し
rows = [
{"name": "coffee", "price": 350, "qty": 2, "tag": "drink"},
{"name": "tea", "price": 280, "qty": 0, "tag": "drink"},
]
stock = {r["name"]: r["qty"] for r in rows if r["qty"] > 0}
print(stock) # {'coffee': 2}
Python例題2:辞書の値に税計算+丸め
prices = {"coffee": 350, "tea": 280, "juice": 220}
with_tax = {k: round(v * 1.1) for k, v in prices.items()}
print(with_tax) # {'coffee': 385, 'tea': 308, 'juice': 242}
Python例題3:2リストから辞書+条件(スコア60以上)
names = ["Alice", "Bob", "Charlie"]
scores = [90, 55, 70]
passed = {n: s for n, s in zip(names, scores) if s >= 60}
print(passed) # {'Alice': 90, 'Charlie': 70}
Python例題4:キーを正規化して“重複キー”を避ける
raw = [" Tea", "tea ", "TEA"]
normalized = {s.strip().lower(): True for s in raw}
print(normalized) # {'tea': True}(重複は一本化)
Pythonまとめ
辞書内包表記は「キーと値を同時に設計し、反復・選別・変換を一行でまとめる」強力な記法です。items()/zip との併用で既存辞書の加工や2リストからの生成が自然に書け、フィルタも末尾の if で簡潔。キー衝突は最後が勝つ、分岐が増えたら通常の for に戻す、巨大データではメモリを意識する——この要点を押さえれば、初心者でも読みやすく堅牢な辞書生成・整形が実装できます。
