Python入門!setの使い方と応用事例 重複削除から高速検索まで!

2025.10.29
カテゴリー:オフショア開発,開発

 

Pythonには多彩なデータ構造がありますが、その中でも重複をなくしたい」「効率よくデータを管理したい」「集合演算を行いたいという場面で強力に活躍するのがset(セット)型です。大量のデータ処理や高速検索に適しており、シンプルながら実務で非常に役立ちます。

 

本記事では、Pythonのset型について、基本的な使い方から応用的なテクニック、さらには業務シーンで活かせるユースケースまで徹底的に解説していきます。初心者はもちろん、Python経験者でも知識を再整理したい方におすすめの内容です。

 

setとは?特徴と基本構文

 

setの特徴

Pythonのset型は、リストやタプルと並ぶ「コレクション型」データ構造のひとつで、以下のような特徴があります。

 

  • 重複要素を自動的に除去
  • 要素の順序を保持しない(=インデックス指定不可)
  • 要素の追加・削除が簡単
  • 集合演算(和・積・差・対称差)が可能

 

fruits = {“apple”, “banana”, “orange”, “apple”}

print(fruits)  # 出力: {‘banana’, ‘orange’, ‘apple’}

 

このように、重複していた”apple”が1つにまとめられているのが分かります。

 

listやtupleとの違い

特徴

list

tuple

set

重複

許容される

許容される

許容されない

順序

保持される

保持される

保持されない

変更

可能(ミュータブル)

不可(イミュータブル)

可能(ミュータブル)

主な用途

並べられた

データの操作

変更しない

データの保持

重複のない

データ管理・集合演算

 

例えば、順序付きで履歴やタスクを扱いたい場合はlistを、固定された設定値の保持にはtupleを、重複のないデータ比較や検索を行いたい場合はsetを選ぶと適しています。

 

setの作成方法

① 波かっこを使う

my_set = {1, 2, 3}

 

② set()コンストラクタを使う

my_set = set([1, 2, 3, 3])  # リストやタプルから作成可能

 

③ 空のsetの作成

空の中かっこ{}は空の辞書になるので、空のsetを作るには必ずset()を使いましょう。

empty_set = set()

 

④ リストやタプルから変換

my_list = [1, 2, 2, 3]

my_set = set(my_list)

print(my_set)  # 結果: {1, 2, 3}

my_tuple = (1, 2, 2, 3)

my_set = set(my_tuple)

print(my_set)  # 結果: {1, 2, 3}

 

setの基本操作

 

要素の追加と削除

my_set = {1, 2, 3}

my_set.add(4)  # 追加

print(my_set)  # {1, 2, 3, 4}

my_set.remove(2)  # 存在する要素を削除

my_set.discard(5)  # 存在しない要素でもエラーなし

print(my_set)  # {1, 3, 4}

 

要素の存在確認

print(3 in my_set)  # True

print(10 in my_set)  # False

 

集合演算の基本

 

和集合(union)

a = {1, 2, 3}

b = {3, 4, 5}

print(a | b)  # {1, 2, 3, 4, 5}

 

積集合(intersection)

a = {1, 2, 3}

b = {3, 4, 5}

print(a & b)  # {3}

 

差集合(difference)

a = {1, 2, 3}

b = {3, 4, 5}

print(a – b)  # {1, 2}

 

対称差(symmetric_difference)

a = {1, 2, 3}

b = {3, 4, 5}

print(a ^ b)  # {1, 2, 4, 5}

 

これらはそれぞれ.union(), .intersection(), .difference(), .symmetric_difference()といったメソッド形式でも記述可能です。

 

実務で役立つsetの応用テクニック

重複データの削除

Webスクレイピングやログ集計など、同じデータが何度も現れる場合にsetが有効です。

 

emails = [“a@example.com”, “b@example.com”, “a@example.com”]

unique_emails = list(set(emails))

print(unique_emails)  # [‘a@example.com’, ‘b@example.com’]

 

高速な検索処理

リスト(list)と比較して、setのin演算子は平均的に高速です。

 

import time

items = list(range(1000000))

target_set = set(items)

start = time.time()

print(999999 in target_set)

print(“set検索時間:”, time.time() – start)

 

リスト検索よりもはるかに短時間で済むため、検索対象が数万件以上ある場合はsetへの変換が強く推奨されます。

 

リスト同士の共通項抽出

list1 = [1, 2, 3, 4]

list2 = [3, 4, 5, 6]

common = set(list1) & set(list2)

print(“共通項目:”, common)  # {3, 4}

 

重複なしで共通部分を抽出する際、setが非常にシンプルかつ高速です。

 

条件一致の高速フィルタリング

例えば、会員IDの一覧とログデータを照合して該当するものだけ抽出する場合:

 

valid_ids = {“U001”, “U002”, “U005”}

access_logs = [“U001”, “U007”, “U002”, “U008”]

matched = [uid for uid in access_logs if uid in valid_ids]

print(matched)  # [‘U001’, ‘U002’]

 

setとfrozensetの違い

 

frozensetは、その名の通り「凍結されたset」で、変更不可(イミュータブル)な集合です

 

fs = frozenset([1, 2, 3])

# fs.add(4)

 

はエラーになります

辞書のキーとして使いたい場合や、変更できないコレクションとして扱いたい場合に利用されます。

 

主な用途例

  • データベースの不変キー
  • キャッシュ処理のキー
  • セキュリティ上の読み取り専用データ

 

よくある注意点と落とし穴

順序が保持されない

set_sample = {“b”, “a”, “c”}

print(set_sample)  # 出力順はランダムに見える

 

setは順序を保証しません。順番を扱う必要がある場合は、listやcollections.OrderedDictを検討しましょう。

 

setに格納できるのは「ハッシュ可能」なオブジェクトのみ

以下のように、リストや辞書などのミュータブル(変更可能)なオブジェクトはsetに追加できません。

 

invalid_set = set()

# invalid_set.add([1, 2, 3])  # TypeError

 

タプルのようにイミュータブルであれば、setに追加可能です。

valid_set = set()

valid_set.add((1, 2, 3))  # OK

 

まとめ

set型は、重複排除、高速検索、集合演算など多くのシーンで効果を発揮するPythonの重要なデータ型です。特にデータの整理・整形、フィルタリング、大量データ処理などでsetを使いこなすことで、プログラムの効率と可読性が大きく向上します。

 

弊社では、データ入力・処理の効率化、自動化ツール、対話型アプリケーションなど、お客様のビジネス課題を解決するPythonソリューションをご提案いたします。

 

  • 「こんなこと、Pythonでできる?」
  • 「既存システムのPython化を検討している」
  • 「業務効率を上げるツールを開発したい」

 

といったご要望がございましたら、ぜひお気軽に3inkへご相談ください。企画から開発、運用まで、お客様のニーズに合わせた最適な開発をサポートいたします。