Pythonの辞書(dictionary, dict)は、キーと値のペアを格納するデータ構造で、その柔軟性と効率性から多くの場面で利用されます。この記事では、Python辞書の基本的な使い方から、辞書内包表記といった少し進んだ使い方まで、サンプルコードを交えながら解説します。
- 辞書とは
- 辞書の作成
- 辞書の要素へのアクセス
- 辞書の要素の追加と更新
- 辞書の要素の削除
- 辞書の反復処理 (ループ)
- その他の便利なメソッド
- 辞書内包表記 (Dictionary Comprehension)
辞書とは
辞書とはキーと値のペアを格納するデータ構造のことで、Pythonでは以下のような形で表現されます。
辞書の構造の例
# 最も簡単な例 simple_dict = { "apple": 1, "banana": 2 }
この例では、キーは果物の名前(文字列)、値はその個数(数値)を表しています。 この辞書というデータ構造は柔軟で、例えば以下のような複雑なデータの形式も表現することができます。
# より複雑な例 my_dict = { "name": "Alice", # キー: 文字列, 値: 文字列 "age": 30, # キー: 文字列, 値: 数値 "is_active": True, # キー: 文字列, 値: 真偽値 "hobbies": ["reading", "hiking"], # キー: 文字列, 値: リスト "address": { # キー: 文字列, 値: 辞書 (ネスト) "street": "123 Main St", "city": "Anytown" } }
この例では、my_dict は5つのキー・バリューペアを持っています。値には、文字列、数値、真偽値、リスト、さらには別の辞書(ネストされた辞書)など、さまざまな型のオブジェクトが格納されており、データの構造を柔軟に表現できることがわかります。
辞書の制約
辞書を作成する際は、以下のような条件を満たす必要があります。
- キーは一意である必要がある (重複不可)。
- 値は重複しても良い。
- ミュータブル (変更可能) なオブジェクトである。
辞書の作成
最も基本的な辞書の作成方法は、波括弧{}を使用し、キーと値を:で区切り、各ペアをカンマ,で区切って記述する方法です。
# 基本的な辞書の作成 my_dict = {"apple": 1, "banana": 2, "orange": 3} print(my_dict) # 出力: {'apple': 1, 'banana': 2, 'orange': 3} # 空の辞書を作成 empty_dict = {} print(empty_dict) # 出力: {} # dict() を使った作成 (あまり一般的ではない) another_dict = dict(apple=1, banana=2, orange=3) print(another_dict) # 出力: {'apple': 1, 'banana': 2, 'orange': 3}
dict() を使用する方法は可読性が低くなる場合があるため、波括弧{} を使用する方法を推奨します。
辞書の要素へのアクセス
辞書の要素にアクセスするには、[]内にキーを指定します。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
# キーを使って値にアクセス
print(my_dict["apple"]) # 出力: 1
存在しないキーにアクセスしようとするとKeyErrorが発生します。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
# 存在しないキーにアクセスすると KeyError
# print(my_dict["grape"]) # KeyError: 'grape'
KeyErrorを避けるためには、.get()メソッドを使用します。.get()メソッドでは、キーが存在しない場合に返すデフォルト値を指定できます。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
# .get() を使ってアクセス
print(my_dict.get("apple")) # 出力: 1
print(my_dict.get("grape")) # 出力: None (デフォルト値はNone)
print(my_dict.get("grape", 0)) # 出力: 0 (デフォルト値を0に設定)
辞書の要素の追加と更新
辞書に新しい要素を追加するには、新しいキーを指定して値を代入します。既存のキーに対して代入を行うと、値が更新されます。
my_dict = {"apple": 1, "banana": 2}
# 新しい要素を追加
my_dict["orange"] = 3
print(my_dict) # 出力: {'apple': 1, 'banana': 2, 'orange': 3}
# 既存の要素を更新
my_dict["apple"] = 10
print(my_dict) # 出力: {'apple': 10, 'banana': 2, 'orange': 3}
.update()メソッドを使うと、一度に複数の要素を追加・更新できます。
my_dict = {"apple": 1, "banana": 2}
additional_data = {"orange": 3, "apple": 10} # appleは更新、orangeは追加される。
# .update() で複数の要素を追加・更新
my_dict.update(additional_data)
print(my_dict) # 出力: {'apple': 10, 'banana': 2, 'orange': 3}
辞書の要素の削除
辞書から要素を削除するには、del文を使用します。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
# del で要素を削除
del my_dict["banana"]
print(my_dict) # 出力: {'apple': 1, 'orange': 3}
.pop() メソッドを使用すると、指定したキーの要素を削除し、その値を返します。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
# .pop() で要素を削除し、値を取得
removed_value = my_dict.pop("banana")
print(my_dict) # 出力: {'apple': 1, 'orange': 3}
print(removed_value) # 出力: 2
# .pop() で存在しないキーを指定すると KeyError
# my_dict.pop("grape") # KeyError: 'grape'
# .pop() で存在しないキーを指定した場合のデフォルト値を設定
removed_value2 = my_dict.pop("grape", -1) #キーが存在しない場合-1を返す
print(removed_value2) # 出力: -1
.clear() メソッドを使用すると辞書内のすべての要素を削除し、空の辞書にします。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
my_dict.clear()
print(my_dict) # 出力: {}
辞書の反復処理 (ループ)
辞書の要素を反復処理するには、forループを使用します。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
# キーのループ
for key in my_dict: # または for key in my_dict.keys():
print(key) # apple, banana, orange の順に出力 (順序は保証されない)
# 値のループ
for value in my_dict.values():
print(value) # 1, 2, 3 の順に出力 (順序は保証されない)
# キーと値のペアのループ
for key, value in my_dict.items():
print(f"{key}: {value}") # apple: 1, banana: 2, orange: 3 の順に出力 (順序は保証されない)
その他の便利なメソッド
| メソッド | 説明 | 使用例 |
|---|---|---|
.keys() |
辞書のすべてのキーを含むビューオブジェクトを返す。 | my_dict.keys() |
.values() |
辞書のすべての値を含むビューオブジェクトを返す。 | my_dict.values() |
.items() |
辞書のすべての(キー、値)のタプルを含むビューオブジェクトを返す。 | my_dict.items() |
len() |
辞書内の要素数を取得する。 | len(my_dict) |
辞書内包表記 (Dictionary Comprehension)
リスト内包表記のように、辞書も内包表記を使って簡潔に生成できます。
# 数値のリストから、{数値: 数値の2乗} という辞書を生成 numbers = [1, 2, 3, 4, 5] squared_dict = {x: x**2 for x in numbers} print(squared_dict) # 出力: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} # 条件付きの辞書内包表記 even_squared_dict = {x: x**2 for x in numbers if x % 2 == 0} print(even_squared_dict) # 出力: {2: 4, 4: 16}