【Python入門】セット(set)の使い方ガイド|重複排除と高速処理をマスターする

【作業自動化】Python
スポンサーリンク

Pythonでデータを扱う際、リスト(list)や辞書(dict)は頻繁に使われますが、実はセット(set)もまた非常に強力なデータ構造です。

特に

  • 「データの重複を取り除きたい」
  • 「2つのグループの共通点を見つけたい」
  • 「大量のデータから高速に検索したい」

といった場面では、リストよりも圧倒的に高いパフォーマンスを発揮します。

この記事では、セットの基本的な使い方から、実務で役立つ集合演算、そして高速に動作する仕組みまで分かりやすく解説していきます。

【作業自動化】Pythonの記事を見る

セット(set)とは?

セットは、数学における「集合」をプログラミングで扱うための型です。リストと似ている部分もありますが、主に次のような特徴を持っています。

  1. 重複する要素を持てない(すべての値が一意・ユニークである)
  2. 順序が保証されない(インデックスによる要素の指定ができない)

「袋の中にバラバラにデータが入っていて、同じ値が入ると自動的に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の記事を見る


Pythonの本は種類が多すぎて、業務効率化に使えるのか見分けるのが大変ですよね。実務自動化に5年以上携わってきた私が、「デスクワークの自動化に即戦力になった本」を厳選して紹介します。失敗しない1冊を見つけたい方は、ぜひ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でしたが、年間100万円以上節約していました。
株式投資で年間360万円以上投資し、iDeCoも併用しています。
総資産はアッパーマス層に到達しました。
資格は日商簿記3級を持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、生産性を高めるITスキルについて発信しています。

生活を豊かにするため、高配当株投資で年間配当金60万円をめざしています。
現在の年間配当金は30万円ほどです。

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【作業自動化】PythonITスキル
スポンサーリンク
ぐーをフォローする

コメント

タイトルとURLをコピーしました