
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へご相談ください。企画から開発、運用まで、お客様のニーズに合わせた最適な開発をサポートいたします。

