辞書内包表記
| 対応: | Python 3.0(2008) |
|---|
辞書内包表記は1行で辞書を生成できる構文です。リスト内包表記と似た形式で、キーと値の変換・フィルタリングをコンパクトに記述できます。
構文
# 基本的な辞書内包表記
{キー式: 値式 for 変数 in イテラブル}
# 条件付き辞書内包表記
{キー式: 値式 for 変数 in イテラブル if 条件式}
# 既存の辞書から生成する
{キー: 変換(値) for キー, 値 in 辞書.items()}
構文のパターン一覧
| パターン | 概要 |
|---|---|
| {k: v for k, v in items()} | 辞書の全エントリを別の辞書に変換します。キーや値に任意の式が使えます。 |
| {k: v for k, v in items() if 条件} | 条件を満たすエントリだけを含む辞書を生成します。 |
| {v: k for k, v in 辞書.items()} | キーと値を入れ替えた辞書を生成します。 |
| {x: x**2 for x in range(n)} | 連番などのイテラブルからキーと値を計算して辞書を生成します。 |
| dict(zip(keys, values)) | 2つのリストをキーと値に対応させて辞書を生成します。 |
サンプルコード
sample_dict_comprehension.py
# 数値の2乗を格納する辞書を生成します。
squares = {x: x**2 for x in range(1, 6)}
print(squares) # 『{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}』と出力されます。
# 条件付きで偶数だけの辞書を生成します。
even_squares = {x: x**2 for x in range(1, 11) if x % 2 == 0}
print(even_squares) # 『{2: 4, 4: 16, 6: 36, 8: 64, 10: 100}』と出力されます。
# 既存の辞書の値を変換します(戦闘力を50倍に)。
power_levels = {'孫悟空': 9000, 'ベジータ': 8000, 'クリリン': 1500}
super_saiyan = {k: v * 50 for k, v in power_levels.items()}
print(super_saiyan) # 『{'孫悟空': 450000, 'ベジータ': 400000, 'クリリン': 75000}』と出力されます。
# キーと値を入れ替えます。
original = {'a': 1, 'b': 2, 'c': 3}
flipped = {v: k for k, v in original.items()}
print(flipped) # 『{1: 'a', 2: 'b', 3: 'c'}』と出力されます。
# 2つのリストを zip() で組み合わせて辞書を生成します。
names = ['孫悟空', 'ベジータ', 'ブルマ']
scores = [85, 92, 78]
result = {name: score for name, score in zip(names, scores)}
print(result) # 『{'孫悟空': 85, 'ベジータ': 92, 'ブルマ': 78}』と出力されます。
# BGM リストと名前リストを zip() で組み合わせます。
songs = ['魔訶不思議アドベンチャー!', 'CHA-LA HEAD-CHA-LA', 'DAN DAN 心魅かれてく']
song_map = {name: song for name, song in zip(names, songs)}
print(song_map) # 『{'孫悟空': '魔訶不思議アドベンチャー!', 'ベジータ': 'CHA-LA HEAD-CHA-LA', 'ブルマ': 'DAN DAN 心魅かれてく'}』と出力されます。
# 文字列のリストをキーにして、文字数を値にします。
words = ['python', 'java', 'javascript']
word_lengths = {w: len(w) for w in words}
print(word_lengths) # 『{'python': 6, 'java': 4, 'javascript': 10}』と出力されます。
# 特定のキーだけを含む辞書を抽出します。
profile = {'name': '孫悟空', 'age': 23, 'org': 'カプセルコーポレーション', 'job': '戦士'}
allowed_keys = {'name', 'org'}
filtered = {k: v for k, v in profile.items() if k in allowed_keys}
print(filtered) # 『{'name': '孫悟空', 'org': 'カプセルコーポレーション'}』と出力されます。
python3 dict_comprehension.py
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
{'孫悟空': 450000, 'ベジータ': 400000, 'クリリン': 75000}
{1: 'a', 2: 'b', 3: 'c'}
{'孫悟空': 85, 'ベジータ': 92, 'ブルマ': 78}
{'孫悟空': '魔訶不思議アドベンチャー!', 'ベジータ': 'CHA-LA HEAD-CHA-LA', 'ブルマ': 'DAN DAN 心魅かれてく'}
{'python': 6, 'java': 4, 'javascript': 10}
{'name': '孫悟空', 'org': 'カプセルコーポレーション'}
概要
辞書内包表記はPythonの強力な機能の一つで、ループと条件式を組み合わせて辞書を1行で生成できます。通常の for ループで辞書を構築するコードと比べて簡潔で読みやすく、Pythonic(Pythonらしい)な書き方とされています。
キーと値の両方に任意の式を使えるため、既存の辞書の変換・フィルタリング・逆引き辞書の生成など様々な場面で活用できます。キーが重複する可能性がある場合は後から処理されたものが優先されます。またキーにはハッシュ可能なオブジェクト(文字列・数値・タプルなど)しか使えず、リストは使えません。
辞書のコピーやマージは『辞書.copy() / dict() / 辞書のマージ』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。