辞書の基本
Pythonの辞書型(dict型)は、キーと値の組み合わせを格納することができるデータ構造です。リストやtupleとの違いは、キーに数値だけではなく、文字列やtupleなどのHashableな値を使用できることが挙げられます。
キーは一つの辞書オブジェクトの中でユニークな値で、値は任意の数値、文字列だけではなく、オブジェクトを格納することができます。
辞書は{}またはdict()を使って作成することができます。辞書にアクセスするにはキーを指定して、括弧[]を使います。辞書はリストと同様、追加、削除、変更が行えます。
dict_sample = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
value1 = dict_sample['key1']
print(value1) # value1
dict_sample['key4'] = 'value4'
dict_sample['key1'] = 'new_value1'
print(dict_sample) # {'key1': 'new_value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4'}
辞書型のメソッド
keys() メソッド
辞書型のキーをリスト形式で返します。
# 辞書型を定義する
dict_data = {'apple': 'りんご', 'banana': 'バナナ', 'grape': 'グレープ'}
# keys()メソッドでキーの一覧を取得する
keys = dict_data.keys()
# キーの一覧を表示する
print(keys)
# 結果:
# dict_keys(['apple', 'banana', 'grape'])
values() メソッド
辞書型の値をリスト形式で返します(キーは含まれません)
# 辞書の作成
d = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# 辞書の値のみを取得する
values = d.values()
# 値の表示
print(values) # dict_values(['value1', 'value2', 'value3'])
items() メソッド
items()メソッドは、キーと値をペアにしたtupleを含むリストを返すメソッドです(2次元のリストのように見える)。このメソッドを使うことで、辞書に含まれる全てのキーと値のペアを処理することができます。
# 辞書型の定義
d = {'apple': 100, 'banana': 200, 'cherry': 300}
# items()メソッドを使用する
for key, value in d.items():
print(f'{key}: {value}')
# 出力結果
# apple: 100
# banana: 200
# cherry: 300
他の言語になれているとitems()メソッドがiterationをするように見えてしまいますが、pythonの for … in … ループは元々iterableなオブジェクトを引数にとるため、itemsメソッドは1度の実行で、リストを返している点に注意します。
get()メソッド
get() メソッドは、辞書型の指定したキーの値を取得するメソッドです。[]括弧とのアクセスとの違いは、値が存在しない場合に、Noneを返すか、あるいはデフォルト値を指定してそのデフォルト値を返すかを選択できる点にあります。
これにより、辞書型に存在しない値を参照した際の例外処理を簡単に実現することができます。
d = {"name": "John", "age": 32}
# キーが存在する場合
print(d.get("name")) # John
# キーが存在しない場合
print(d.get("gender")) # None
# デフォルト値を指定する場合
print(d.get("gender", "Unknown")) # Unknown
update()メソッド
update()メソッドは、辞書型にキーと値を追加、更新を行えます。
# 辞書を作成する
person = {'name': 'John', 'age': 30}
# 辞書にキーと値を追加する
person.update({'gender': 'Male'})
# 辞書を出力する
print(person) # {'name': 'John', 'age': 30, 'gender': 'Male'}
代入でもほぼ同様の操作を行えますが、updateの方は、視認性に優れているという特徴があります。また、次のように一度に複数のキーと値のペアを更新することもできます。
d = {"a": 1, "b": 2}
d.update({"c": 3, "d": 4})
print(d) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
update() メソッドに辞書型を引数として渡すことで、2つの辞書が結合された状態になります。そのため、上記のように複数の値を一度に追加することができます。
このようにメリットの多いupdate()メソッドですが、値を1つ1つ追加していく場合、d[key] = value のようなシンプルな代入と比較して速度が遅いという欠点があります。日常的に用いられるアプリケーションでは差が出ることはほぼないと思います。しかし、数万件のレコードを取り扱うビッグデータの解析や、多くの人がアクセスするWeb / クラウドアプリケーションではボトルネックとなる場合があるので、気をつけましょう。
おわりに
辞書型の特徴は、キーと値のペアで格納される点です。キーに文字列などの数値型以外を使用することができるため、キーが分かっていれば値を高速な検索を行うことができます。
一般的にExcelで表をつくる場合も、列・行番号だけではなく、人間が見て分かりやすいように列名(場合によっては行名も)付けることがあります。辞書型のシンプルな活用方法はそれと同様に、人間が分かりやすい「ラベル」を付けることが挙げられます。例えば、「価格」「個数」「税率」「商品名」などのキーを含む辞書を用意して、合計金額を求めるような活用方法があります。
また、RDBMSの主キーとして、数値以外が使われている場合(例えば、商品IDや、メンバーのメールアドレスなど)にも、辞書型を利用すると簡単にPython上でデータ構造を再現することができます。