Pythonでデータを扱う際、リスト(list)や辞書(dict)は頻繁に使われますが、実はセット(set)もまた非常に強力なデータ構造です。
特に
- 「データの重複を取り除きたい」
- 「2つのグループの共通点を見つけたい」
- 「大量のデータから高速に検索したい」
といった場面では、リストよりも圧倒的に高いパフォーマンスを発揮します。
この記事では、セットの基本的な使い方から、実務で役立つ集合演算、そして高速に動作する仕組みまで分かりやすく解説していきます。
セット(set)とは?
セットは、数学における「集合」をプログラミングで扱うための型です。リストと似ている部分もありますが、主に次のような特徴を持っています。
- 重複する要素を持てない(すべての値が一意・ユニークである)
- 順序が保証されない(インデックスによる要素の指定ができない)
「袋の中にバラバラにデータが入っていて、同じ値が入ると自動的に1つにまとまる」というイメージを持つと分かりやすいと思います。
基本的な使い方:作成と重複の排除
実務の場面でもっとも頻繁に使われるのが、「リストから重複を取り除く」処理です。
# 重複を含むリスト
id_list = [101, 102, 101, 103, 102]
# set()で変換すると、自動的に重複が消える
unique_ids = set(id_list)
print(unique_ids)
# 出力: {101, 102, 103}
基本的な使い方:要素の追加と削除
セットは変更可能な(mutable)オブジェクトです。後からデータを追加・削除できます。
- 追加:add()
- 削除:remove()(指定した要素が存在しない場合はエラー)
- 安全な削除: discard()(要素が存在しなくてもエラーが発生しない)
members = {"Alice", "Bob"}
members.add("Charlie") # 追加
members.discard("Alice") # 安全に削除
print(members)
# 出力例: {'Bob', 'Charlie'}
強力な機能:集合演算
セットを使う最大のメリットは、ベン図のような「集合演算」が演算子ひとつで書けることです。
例えば、2つのチームが保有するスキルセットを比較してみましょう。
# Aチームのスキル
team_a = {"Python", "Java", "SQL"}
# Bチームのスキル
team_b = {"Python", "Go", "AWS"}
積集合(Intersection): &
「両方のチームが共通して持っているスキル」を抽出します。
common = team_a & team_b
print(common)
# 出力: {'Python'}
和集合(Union): |
「2つのチームのスキルを合わせた全スキル(重複なし)」を抽出します。
all_skills = team_a | team_b
print(all_skills)
# 出力例: {'Python', 'Java', 'SQL', 'Go', 'AWS'}
差集合(Difference): –
「Aチームにはあるが、Bチームにはないスキル」を抽出します。
実務では新規顧客の抽出や、不足データの確認に使えます。
only_a = team_a - team_b
print(only_a)
# 出力例: {'Java', 'SQL'}
なぜセットは「検索」が速いのか?
大量のデータを扱う際、リストとセットでは検索速度に雲泥の差が出ます。
特定のデータが含まれているかを確認する x in data という処理を比較してみましょう。
| データ型 | 特徴 |
| リスト (list) | 先頭から順に走査するため、データ量に比例して遅くなります。 |
| セット (set) | ハッシュ値を基に格納場所を直接特定するため、瞬時に完了します。 |
例えば、リストでは最悪の場合100万回の探索が必要になりますが、セットであれば件数に関わらずわずか1ステップ程度で特定できます。
検索頻度が高いマスタデータなどは、セットに変換しておくのがおすすめです。
発展的な使い方と注意点
変更できないセット:frozenset
セットそのものを辞書のキーとして利用したい場合や、誤って要素を変更されたくない場合は、不変(イミュータブル)なfrozensetを使用します。
# 変更不可のセットを作成
fixed_set = frozenset(["A", "B", "C"])
# 通常のsetと異なり、辞書のキーとして安全に利用可能
my_dict = {fixed_set: "Group 1"}
セットに入れられないもの
セットの要素になれるのは、「ハッシュ可能(hashable)」なオブジェクトだけです。
つまり、リストや辞書といった「後から中身が変わるもの」はセットの要素として登録できません。
# OK: タプルは変更不可なので入れられる
s = { (1, 2), (3, 4) }
# NG: リストは変更可能なのでエラーになる
# s = { [1, 2], [3, 4] } # -> TypeError: unhashable type: 'list'
まとめ
- 重複削除なら set(list):たった1行でクリーンなデータを作れます。
- 共通項・差分の抽出なら集合演算:&, |, – を活用して複雑なロジックをシンプルに記述できます。
- 高速判定ならセットの in 検索: 大量データに対する存在確認はリストよりも圧倒的に高速です。
Pythonのセットは、単純なデータ格納庫としてだけでなく、アルゴリズムの最適化やコードの可読性向上に直結する重要な機能となります。
ぜひ日々のコーディングに取り入れてみてください!
Pythonの本は種類が多すぎて、業務効率化に使えるのか見分けるのが大変ですよね。実務自動化に5年以上携わってきた私が、「デスクワークの自動化に即戦力になった本」を厳選して紹介します。失敗しない1冊を見つけたい方は、ぜひ参考にしてみてください。

コメント