Python独習塾

  • ホーム
  • Pythonのset(集合)の解説

Pythonのset(集合)の解説

  • 作成日: 2025-07-15
  • 更新日: 2025-07-19
  • カテゴリ: 基本
  • タグ: set, 集合

Pythonの集合型(set)を解説します。
参考ドキュメントは以下になります。

出典:5. 集合型 — データ構造 — Python 3.13.5 ドキュメント

Pythonのset(集合)とは?

Pythonのsetは、以下の特徴を持ちます。

  • 重複した値を許さない
  • 値は順序を持たない
  • 集合演算(和、積、差など)ができる

listやdictなどと同じ、複数の値をまとめて管理するためのオブジェクトです。
例えば以下のように使います。

s = {2, '1', 3.14}  
print(s)  # {'1', 2, 3.14}  

s.add(4)  
print(s)  # {'1', 2, 3.14, 4}  

setは重複した値を許さないので、同じ値を追加した場合は無視されます。

s = {1, 2}  

s.add(1)  
s.add(2)  

print(s)  # {1, 2}  

Pythonのsetでアイテムを追加するには?

Pythonのset(集合)でアイテムを追加するにはaddメソッドを使います。

出典:5. 集合型 — データ構造 — Python 3.13.5 ドキュメント

s = {1, 2}  

s.add(3)  
s.add(4)  

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

Pythonのsetの集合演算

Pythonのsetで和集合を扱うには?

Pythonのset(集合)で和集合を扱うには|演算子を使います。

出典:5. 集合型 — データ構造 — Python 3.13.5 ドキュメント

s1 = {1, 2}  
s2 = {3, 4}  
s3 = s1 | s2  

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

上記のように集合と集合を|演算子で演算すると、その和集合が得られます。
|=演算子を使うことで集合に集合を和算することもできます。

s1 = {1, 2}  
s2 = {3, 4}  
s1 |= s2  

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

Pythonのsetで積集合を扱うには?

Pythonのset(集合)で積集合を扱うには&演算子を使います。

出典:5. 集合型 — データ構造 — Python 3.13.5 ドキュメント

s1 = {1, 2, 3}  
s2 = {3, 4, 5}  
s3 = s1 & s2  
print(s3)  # {3}  

積集合は二つの集合のうち、両方に存在する要素を抽出します。上記の場合はs1s2にはそれぞれ3が存在しますので、積集合演算でこの要素が抽出されます。
&=演算子を使うことで集合に積集合演算を代入することができます。

s1 = {1, 2, 3}  
s2 = {3, 4, 5}  
s1 &= s2  
print(s1)  # {3}  

Pythonのsetで差集合を扱うには?

Pythonのset(集合)で差集合を扱うには-演算子を使います。

出典:5. 集合型 — データ構造 — Python 3.13.5 ドキュメント

s1 = {1, 2, 3}  
s2 = {3, 4, 5}  
s3 = s1 - s2  
print(s3)  # {1, 2}  

差集合は演算子の左側の集合から右側の集合の要素を取り除いた結果の集合を返します。上記の場合はs1には1, 2, 3がありますが、s2には3, 4, 5があり、s1 - s2ではs1から3の要素が取り除かれます。
-=演算子を使うことで代入差集合演算が可能です。

s1 = {1, 2, 3}  
s2 = {3, 4, 5}  
s1 -= s2  
print(s1)  # {1, 2}  

Pythonのsetで対称差を扱うには?

Pythonのset(集合)で対称差を扱うには^演算子を使います。

出典:5. 集合型 — データ構造 — Python 3.13.5 ドキュメント

s1 = {1, 2, 3}  
s2 = {3, 4, 5}  
s3 = s1 ^ s2  
print(s3)  # {1, 2, 4, 5}  

対称差は演算子の両側の集合にともに含まれている要素が除かれます。
^=演算子を使うことで代入演算も可能です。

s1 = {1, 2, 3}  
s2 = {3, 4, 5}  
s1 ^= s2  
print(s1)  # {1, 2, 4, 5}  

Pythonのsetでappendを使うには?

Pythonのsetにはappendメソッドはありません。代わりにaddメソッドを使います。

出典:5. 集合型 — データ構造 — Python 3.13.5 ドキュメント

s = {1, 2}  

s.add(3)  
s.add(4)  

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

集合を一度リストに変換するとリストのappendを使うことができます。

s = {1, 2}  
lis = list(s)  # 集合をリストに変換  

# appendメソッドを使う  
lis.append(3)  
lis.append(4)  

s = set(lis)  # リストを集合に変換  

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

setのaddメソッドとlistのappendはどちらのほうが速いのでしょうか?
テストしてみました。

import timeit  

# set の add を使うバージョン  
def set_add_version():  
    s = set()  
    for i in range(1000000):  
        s.add(i)  
    return s  

# list の append を使うバージョン  
def list_append_version():  
    lis = []  
    for i in range(1000000):  
        lis.append(i)  
    return lis  

# 時間を計測  
list_append_time = timeit.timeit(list_append_version, number=10)  
set_add_time = timeit.timeit(set_add_version, number=10)  

print(f"list append: {list_append_time:.4f} 秒 (10 回平均)")  
print(f"set add: {set_add_time:.4f} 秒 (10 回平均)")  

結果は以下になりました。

list append: 0.5715 秒 (10 回平均)  
set add: 0.6673 秒 (10 回平均)  

リストのappendの方が少し速いですね。ということは、リストでappendしてから集合に変換したほうが速かったりするのでしょうか? 試してみました。

import timeit  

# set の add を使うバージョン  
def set_add_version():  
    s = set()  
    for i in range(1000000):  
        s.add(i)  
    return s  

# list の append を使い、集合に変換するバージョン  
def list_append_version():  
    lis = []  
    for i in range(1000000):  
        lis.append(i)  
    return set(lis)  

# 時間を計測  
list_append_time = timeit.timeit(list_append_version, number=10)  
set_add_time = timeit.timeit(set_add_version, number=10)  

print(f"list append: {list_append_time:.4f} 秒 (10 回平均)")  
print(f"set add: {set_add_time:.4f} 秒 (10 回平均)")  

リストでappendで値を追加してから、集合に変換するようにしてみました。結果は以下になりました。

list append: 0.8864 秒 (10 回平均)  
set add: 0.6637 秒 (10 回平均)  

やはりリストから集合に変換する分コストがかかっているので、そのまま集合のaddを使った方が速いという結果になりましたね。
この結果を見る限りではappendを無理に使う必要はなさそうです。

Pythonのsetをlistに変換するには?

Pythonのsetをlist()に渡すと、リストに変換できます。

s = {1, 2, 3}  
lis = list(s)  
print(lis)  # [1, 2, 3]  

listをsetに変換するにはリストをset()に渡します。

lis = [1, 2, 3]  
s = set(lis)  
print(s)  # {1, 2, 3}  

Pythonのsetで要素の順番を意識して扱うには?

Pythonのset(集合)は順番の概念がありません。しかしsorted関数を使うと、集合をソートしてリストとして取得できます。

s = {3, 1, 2}  

lis = sorted(s)  
print(lis)  # [1, 2, 3]  

# 逆順  
lis = sorted(s, reverse=True)  
print(lis)  # [3, 2, 1]  

また外部ライブラリのordered-setを使うと、順番を保持した集合を使うことができます。

出典:ordered-set·PyPI

$ pip install ordered-set  
from ordered_set import OrderedSet  

s = OrderedSet([3, 1, 2])  
print(s)  # OrderedSet([3, 1, 2])  

Pythonのsetとlistの違いは?

Pythonのsetとlistの違いは以下の通りです。

  • set: 重複した値を許さない
  • list: 重複した値を許す
  • set: 順序がない
  • list: 順序がある
  • set: 集合演算ができる
  • list: 集合演算ができない

setは重複した値を許さないというのが大きな特徴で、listからsetに変換するとリスト内の重複した値を除去することができます。その後、再び集合をリストに変換すれば、重複した要素を持たないリストができます。

lis = [1, 2, 2, 3, 3]  

s = set(lis)  # リストを集合に変換(重複した要素を除去)  
lis = list(s)  # 集合を再びリストに変換  

print(lis)  # [1, 2, 3]  

Pythonのsetの計算量は?

Pythonのsetの計算量をまとめました。

出典:TimeComplexity - Python Wiki

  • 長さの取得 len(s) ... O(1)
  • 値の参照 s[0] ... O(1)
  • 値の追加 s.add(1) .... O(1)
  • 値の削除 s.discard(item) ... O(1)
  • イテレーション for item in s ... O(n)
  • in演算子 item in s ... O(n)

O(1)は定数時間でハッシュマップの要素の参照などが該当します。
O(n)は線形時間で一重のループ文などが該当します。

Pythonの集合は値の取得、追加、削除が定数時間で行えます。そのため非常に高速だと言えます。

Pythonのsetをsortするには?

Pythonのsetをsortするにはsorted関数を使います。

出典:ソートのテクニック — Python 3.13.5 ドキュメント

s = {3, 1, 2}  

print(sorted(s))  # [1, 2, 3]  

# 逆順  
print(sorted(s, reverse=True))  # [3, 1, 2]  

集合をsorted関数でソートすると結果はリストになります。集合は順序を持たないので、順序を持つリストに変換されるんですね。
setはsortメソッドは持っていないので、sortメソッドの呼び出しはできません。

s = {3, 1, 2}  
s.sort()  
# AttributeError: 'set' object has no attribute 'sort'  

Pythonのsetの要素数を得るには?

Pythonのset(集合)の要素数を得るにはlen関数を使います。

s = {1, 2, 3}  
print(len(s))  # 3  

Pythonのsetを初期化するには?

Pythonのset(集合)を初期化するにはset(){}を使います。要素がある初期化には{}を使うのが一般的で、空集合にはset()を使います。

s1 = set()  # 空集合  
d = {}  # これは辞書になる  
s2 = {1, 2}  # 要素ありの集合  

print(s1)  # set()  
print(s2)  # {1, 2}  

カテゴリー