辞書、集合とは何か

Pythonでは、複数のデータを効率的に扱うためのコレクション型として、これまで学んだリストやタプルのほかに、辞書(dictionary / ディショナリ)と集合(set / セット)が用意されています。これらのデータ構造は、特定のデータを一瞬で見つけ出したり、重複を自動で排除したりする強力な仕組みを備えており、実務のデータ処理において不可欠な存在です。この記事では、辞書と集合の基本的な概念と、その特徴や用途について解説します。
辞書とは
辞書は、「キー(Key)」と「値(Value)」をペアにして格納するデータ構造です。現実の国語辞典で「単語(キー)」を引くと「その意味(値)」が載っているのと同じイメージです。
辞書は中括弧 {} を使って定義し、キーと値をコロン : で区切ります。リストやタプルのように「0番目、1番目…」というインデックス(添字)の番号で管理するのではなく、固有の「キー」を指定してダイレクトに値にアクセスするのが最大の特徴です。
# 辞書の定義例
person = {
"name": "Alice",
"age": 25,
"city": "Tokyo"
}
# キーを使って値にアクセス
print(person["name"]) # Alice
# 新しいペアの追加や上書きも簡単
person["email"] = "alice@example.com" # 追加
person["age"] = 26 # 上書き
print(person) # {'name': 'Alice', 'age': 26, 'city': 'Tokyo', 'email': 'alice@example.com'}
辞書の中のキーは「重複が絶対に許されない(一意である)」というルールがあります。そのため、すでに存在するキー(上の例の "age")に対して値を代入すると、エラーにならずに中身が自動的に上書きされます。
集合とは
集合は、重複しない要素だけを詰め込むデータ構造です。数学の授業で習った「ベン図」をイメージするとわかりやすいでしょう。
集合も辞書と同じ中括弧 {} で定義されますが、コロン(:)を使わずに値だけをカンマで区切って記述します。集合の中に入った要素には「順序(並び順)」という概念がありません。そのため、インデックスを使って「0番目の要素を取り出す」といった操作はできません。
# 集合の定義例(あえて重複させて記述)
fruits = {"apple", "banana", "cherry", "apple", "banana"}
# 自動的に重複が消去されます
print(fruits) # 例: {'banana', 'cherry', 'apple'} (順序はバラバラになります)
# 集合に新しい要素を追加
fruits.add("orange")
print(fruits) # 例: {'banana', 'cherry', 'apple', 'orange'}
上記の例の通り、定義するときに同じ文字列をいくつ入れても、集合型になった時点で自動的に1つにまとめられます。この性質を利用して、リストから重複データを一撃で排除する、といったテクニックがよく使われます。
追加解説:リストと何が違う?辞書と集合の「圧倒的な検索スピード」
辞書の「キー」と、集合の「要素」の裏側には、ハッシュテーブルという非常に高度な仕組みが採用されています。
リストの中から特定のデータを検索する場合、Pythonは先頭から1つずつ順番に探していく(データが100万個あれば最大100万回チェックする)ため、データ量に比例して時間がかかってしまいます。しかし、辞書や集合であれば、データが100万個あろうが1億個あろうが、狙ったデータをほぼ「一瞬(1回の計算)」で見つけ出すことができます。この圧倒的な高速性が、リストとの最大の機能差です。
辞書と集合の違い一覧表
辞書と集合は同じ中括弧 {} 仲間ですが、役割は明確に分かれています。
| 比較項目 | 辞書(dictionary) | 集合(set) |
|---|---|---|
| 構造と目的 | {"キー": 値}2つのデータを関連付けて管理する |
{要素1, 要素2}重複のない単一の値の集まりを管理する |
| 要素へのアクセス | 辞書["キー"] で値を取り出せる |
順序がないため、直接個別には取り出せない ( for文でループするか、リストに変換する) |
| データの重複 | 「キー」の重複はNG (「値」の重複はOK) |
すべての要素において重複は完全にNG |
| 主なメソッド | get(), keys(), values(), items() |
add(), remove(), union(), intersection() |
辞書と集合の使用例
それぞれの個性を生かした実務的なコード例です。特に集合の「まとめて計算(集合演算)」の便利さに注目してください。
# 辞書の使用例:安全なデータ取得(getメソッド)
person = {"name": "Alice", "age": 25}
# 存在しないキーを指定してもエラーにならず None を返してくれる
print(person.get("email")) # None
# 集合の使用例:2つのグループのデータを比較する(集合演算)
set_a = {"Python", "JavaScript", "C++"}
set_b = {"Java", "Python", "Ruby"}
# 1. 和集合(union): 両方のグループにいる言語すべて(重複なし)
print(set_a.union(set_b)) # {'C++', 'Ruby', 'Python', 'JavaScript', 'Java'}
# 2. 積集合(intersection): 両方のグループに共通して存在する言語
print(set_a.intersection(set_b)) # {'Python'}
# 3. 差集合(difference): set_a だけが持っている言語
print(set_a.difference(set_b)) # {'C++', 'JavaScript'}
まとめ
Pythonの辞書と集合は、大量のデータを高速かつスマートに処理するための強力なコレクション型です。名前やIDなどの固有情報からデータを瞬時に引き出したいときは「辞書」を、データの重複を綺麗さっぱり無くしたいときや、2つのデータ群を比較して共通点や相違点を洗い出したい(集合演算)ときは「集合」を選択します。リスト・タプル・辞書・集合の4大コレクションを状況に応じて使い分けられるようになれば、Pythonのデータ処理はマスターしたも同然です。