このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】キーと値の組を格納する辞書

キーと値の組を格納する辞書

 辞書は、キーと値の組を効率的に管理し、高速な検索を実現するためのマッピング型データ構造です。Pythonの辞書は内部でハッシュ法を利用しており、指定したキーに対応する値を瞬時に取得できます。実世界での辞書が単語とその意味を結びつけるように、Pythonの辞書もキー(見出し語)と値(その説明やデータ)を関連付けて管理します。ここでは、キーと値の組をどのように格納するか、辞書の作成方法や特性、また検索の高速性などについて、具体例と表を用いて詳しく解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.辞書の基本概念と特徴

 辞書は「キー: 値」のペアを波括弧 {} の中にカンマで区切って並べることで作成されます。以下の表は、辞書の主要な特徴と、それがどのように現実世界の辞書に似ているかを示しています。

特徴説明
キーと値の組キーに対して値を関連付け、素早く値を検索可能。
ミュータブル辞書は作成後も要素の追加、削除、更新ができる。
キーの一意性同じキーを複数回格納すると、後から指定した値で上書きされる。
キーのハッシュ法による管理キーはハッシュ法により管理され、指定したキーを高速に見つけることができる。
挿入順序の保持(Python 3.7以降)キーが追加された順序が、取り出す際にも保持される。

解説

  • 辞書は、キーを元に内部のハッシュテーブルから対応する値を高速に取得するため、検索処理が非常に効率的です。
  • 辞書のキーは必ずハッシュ可能(イミュータブル)なオブジェクトでなければならず、例えば数値、文字列、タプルなどが使用されます。

1.1. 辞書の用途と実世界の例

 辞書は、例えば電話帳、商品カタログ、言語辞典など、見出し語(キー)に対する情報(値)を管理するのに適しています。たとえば、国コードと国名を関連付けた辞書を考えてみます。

サンプルプログラム

# 国コードをキー、国名を値とする辞書の例
countries = {'us': 'United States', 'jp': 'Japan', 'de': 'Germany'}
print("国コードと国名の辞書:", countries)
# 出力例: 国コードと国名の辞書: {'us': 'United States', 'jp': 'Japan', 'de': 'Germany'}

実行結果

国コードと国名の辞書: {'us': 'United States', 'jp': 'Japan', 'de': 'Germany'}

解説

  • この辞書では、'us' というキーに対して 'United States' という値が対応付けられています。
  • 実際のアプリケーションでは、商品コード、ユーザーID、エラーメッセージなど、さまざまな情報の管理に辞書が利用されます。

1.2. 辞書の作成方法

辞書は主に波括弧 {} を用いて作成しますが、以下のようにいくつかの方法があります。

(a) リテラル記法による作成

サンプルプログラム

# 複数のキーと値を持つ辞書(波括弧を使用)
lang = {'us': 'English', 'jp': 'Japanese', 'fr': 'French'}
print("リテラル記法による辞書:", lang)

実行結果

リテラル記法による辞書: {'us': 'English', 'jp': 'Japanese', 'fr': 'French'}

(b) dict 関数を使った作成

サンプルプログラム

# キーと値の組のタプルをリストにまとめて作成
lang2 = dict([('us', 'English'), ('jp', 'Japanese'), ('fr', 'French')])
print("dict 関数を使った辞書:", lang2)

実行結果

dict 関数を使った辞書: {'us': 'English', 'jp': 'Japanese', 'fr': 'French'}

(c) キーワード引数を使った作成

サンプルプログラム

# キーワード引数を利用して作成(キーは識別子として記述)
lang3 = dict(us='English', jp='Japanese', fr='French')
print("キーワード引数で作成した辞書:", lang3)

実行結果

キーワード引数で作成した辞書: {'us': 'English', 'jp': 'Japanese', 'fr': 'French'}

下記の表は、上記3つの作成方法の違いをまとめたものです。

作成方法記法例特徴
リテラル記法{'us': 'English', 'jp': 'Japanese', 'fr': 'French'}直感的で読みやすい。
dict 関数とイテラブルdict([('us', 'English'), ('jp', 'Japanese'), ('fr', 'French')])任意のイテラブルから辞書を生成できる。
dict 関数とキーワード引数dict(us='English', jp='Japanese', fr='French')キーが識別子として記述でき、簡潔な記法が利用可能

解説

  • どの方法も同じ辞書を生成しますが、用途に応じて使い分けることができます。
  • リテラル記法は最も一般的ですが、外部データから動的に辞書を作成する場合は dict 関数が便利です。

2.辞書のキーと値の操作

 辞書は、キーを高速に検索して対応する値を取り出すために設計されています。また、キーは一意であり、重複するキーが指定された場合、後からの値で上書きされます。

2.1. キーによる値の取得

 実世界の辞書で見出し語に対応する説明を調べるように、Pythonの辞書でもキーを指定することで、対応する値を取得できます。

サンプルプログラム

# 辞書からキー 'jp' を使って値を取得する例
language = lang['jp']
print("キー 'jp' の値:", language)
# 出力例: キー 'jp' の値: Japanese

実行結果

キー 'jp' の値: Japanese

解説

  • lang['jp'] とすることで、キー 'jp' に対応する値がすぐに返されます。
  • キーが存在しない場合は KeyError が発生するため、存在確認が必要な場合は get() メソッドを使用すると良いでしょう。

2.2. キーの上書きと順序の保持

 辞書に同じキーを複数回追加すると、後から指定した値で上書きされます。また、Python 3.7以降、辞書はキーが追加された順序を保持します。

サンプルプログラム

# 同じキー 'jp' を複数回使用した例
lang_update = {'us': 'English', 'jp': 'Japanese', 'jp': 'Nihongo', 'fr': 'French'}
print("キーの上書き結果:", lang_update)
# 出力例: キーの上書き結果: {'us': 'English', 'jp': 'Nihongo', 'fr': 'French'}

実行結果

キーの上書き結果: {'us': 'English', 'jp': 'Nihongo', 'fr': 'French'}

解説

  • キー 'jp' は最初 'Japanese' として追加されましたが、その後 'Nihongo' で上書きされ、最終的には 'Nihongo' が辞書に残ります。
  • なお、追加された順序が保持されるため、キーの順序が辞書を表示したときにそのまま反映されます。

まとめ

 辞書は、キーと値の組を格納することで、指定したキーに対する値を迅速に検索・取得するための強力なデータ構造です。

  • 基本概念: 辞書は、波括弧 {} 内に「キー: 値」のペアをカンマ区切りで格納して作成します。
  • 作成方法: リテラル記法、dict 関数、キーワード引数を用いた方法があり、用途に応じて使い分けが可能です。
  • キーの特性: キーはハッシュ法によって管理され、重複したキーは後の値で上書きされ、追加された順序が保持されます。
  • 利用例: 辞書は、実世界の辞書のように、キーに対する情報の検索や、データのマッピングに非常に適しており、商品情報、設定データ、翻訳データなど、さまざまな場面で利用されます。

 これらの特徴を理解することで、Pythonにおける辞書の活用方法を効果的に習得し、プログラムの効率的なデータ管理に役立てることができます。