概要
辞書内包表記(Dictionary comprehensions)は、Python
で簡潔に辞書を作成するための強力な方法です。リスト内包表記と同様に、シンプルな構文で辞書を生成でき、コードの可読性が向上し、効率的な辞書操作が可能になります。この記事では、基本的な使い方から応用例までを詳しく解説し、辞書内包表記の利便性を紹介します。
辞書内包表記の基本構文
辞書内包表記の基本構文は次の通りです。
{key: value for 要素 in イテラブル}
この構文では、イテラブル(例えばリストや範囲など)から要素を取り出し、その要素を使ってキーと値のペアを作成し、新しい辞書を生成します。
例: 数字とその2乗の辞書を作成
squares = {x: x2 for x in range(5)}
print(squares) # 出力: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
この例では、range(5)
の各要素をキーにし、その2乗を値にして辞書を生成しています。
条件付き辞書内包表記
辞書内包表記にはif
文を追加することで、特定の条件に合った要素だけを辞書に含めることができます。これにより、フィルタリングしたデータを簡単に辞書に変換することが可能です。
例: 偶数のみを含む辞書
even_squares = {x: x2 for x in range(10) if x % 2 == 0}
print(even_squares) # 出力: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
この例では、x % 2 == 0
という条件を加えることで、偶数のキーとその2乗の値を持つ辞書を作成しています。
辞書のキーや値を操作する
辞書内包表記では、元の辞書のキーや値を操作して、新しい辞書を簡単に作ることができます。これにより、既存の辞書のデータを変換したり、再構成することが可能です。
例: 値を2倍にする辞書の作成
original_dict = {'a': 1, 'b': 2, 'c': 3}
doubled_values = {key: value * 2 for key, value in original_dict.items()}
print(doubled_values) # 出力: {'a': 2, 'b': 4, 'c': 6}
original_dict.items()
は、キーと値のペアを返し、それを使って辞書内包表記で各値を2倍にしています。
例: キーと値を逆にする辞書の作成
original_dict = {'a': 1, 'b': 2, 'c': 3}
reversed_dict = {value: key for key, value in original_dict.items()}
print(reversed_dict) # 出力: {1: 'a', 2: 'b', 3: 'c'}
この例では、key
とvalue
のペアを逆にして、新しい辞書を生成しています。
複数の辞書を結合する
辞書内包表記は、複数の辞書を結合したり、特定のキーの値を更新する場合にも役立ちます。これは、辞書を組み合わせて新しい辞書を作りたい場合に便利です。
例: 2つの辞書を結合
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged_dict = {key: value for d in (dict1, dict2) for key, value in d.items()}
print(merged_dict) # 出力: {'a': 1, 'b': 3, 'c': 4}
この例では、dict1
とdict2
のキーと値を結合して、新しい辞書を作成しています。重複するキーがある場合、後から出現する辞書の値が優先されます。
応用例
辞書内包表記は、単純な辞書の作成にとどまらず、様々なデータ変換やフィルタリングに役立ちます。いくつかの応用例を見ていきましょう。
複雑な式を使った辞書の作成
辞書内包表記では、キーや値に対して複雑な式を適用することも可能です。
例: 数字の分類辞書
numbers = range(10)
classification = {x: ('even' if x % 2 == 0 else 'odd') for x in numbers}
print(classification)
# 出力: {0: 'even', 1: 'odd', 2: 'even', 3: 'odd', 4: 'even', 5: 'odd', 6: 'even', 7: 'odd', 8: 'even', 9: 'odd'}
この例では、各数字を'even'
または'odd'
に分類して、キーと分類結果のペアを持つ辞書を作成しています。
文字列操作による辞書の作成
辞書内包表記は文字列操作にも使えます。例えば、リストに含まれる単語の長さを辞書にまとめることができます。
例: 単語の長さを計算する辞書
words = ["apple", "banana", "cherry"]
word_lengths = {word: len(word) for word in words}
print(word_lengths) # 出力: {'apple': 5, 'banana': 6, 'cherry': 6}
この例では、リストの各単語をキー、その長さを値として持つ辞書を作成しています。
ネストされた辞書の操作
辞書内包表記は、ネストされた辞書(辞書の中に辞書が含まれる構造)を操作する場合にも使えます。例えば、ネストされた辞書の特定の部分を抽出することができます。
例: ネストされた辞書から特定のキーを抽出
nested_dict = {
'fruit': {'apple': 2, 'banana': 3},
'vegetable': {'carrot': 5, 'spinach': 1}
}
extracted = {category: items['apple'] for category, items in nested_dict.items() if 'apple' in items}
print(extracted)
# 出力: {'fruit': 2}
この例では、ネストされた辞書から'apple'
が含まれている部分だけを抽出しています。
辞書内包表記の利点
辞書内包表記を使うと、次のような利点があります。
- コードの簡潔化: 辞書を作成する際、ループや条件式を1行にまとめることで、コードがシンプルで読みやすくなります。
- 効率性の向上: 内包表記は通常のループよりも高速に動作するため、大規模なデータ操作に適しています。
- 柔軟性: 変数の操作や条件式、複雑な処理を簡単に適用できるため、辞書の生成や変換に柔軟に対応できます。
まとめ
Python
の辞書内包表記は、辞書を効率的かつ簡潔に作成できる便利な方法です。ループや条件式を使って辞書の生成を1行で記述でき、コードの可読性とパフォーマンスが向上します。シンプルな辞書の作成から、複雑なフィルタリングやデータ変換まで、幅広い用途で活用できるため、ぜひ活用してみてください。