
Table of Contents(目次)
setとは – Pythonの集合型の基本と特徴
setは、要素の重複がなく、順序を保持しない、要素の集まり(コレクション)です。
setの主な用途は次の通りです。
- 帰属テスト(ある値がsetに存在するかどうか)
- listなどの要素の重複除去
- 積集合、和集合、差集合、対称差 (排他的論理和) のような数学的演算の計算

setには順序がないので、挿入の順序や要素の位置を記録しません。ですので、setは要素番号を使った操作や、その他のシーケンス的な振舞いをサポートしません。
setの初期化 – 空のsetと要素を持つsetの作り方
まずは、setの初期化を行ってみましょう。次のようにコードを記述します。
# 要素数0のset
s1 = set()
print(s1, type(s1)) # set() <class 'set'>
# 要素を持つset
s2 = {'0', '1', '2'}
print(s2, type(s2)) # {'2', '0', '1'} <class 'set'> (※順序は保証されないため出力の順序は変わることがあります)
setは、要素を持たない時はset()
関数を使って初期化します。要素を持つときは波カッコ{}
を使い、各要素をカンマで区切りながら記述します。Pythonは、波カッコの中で単純に要素がカンマで区切られていたらset、key:value
の形で要素が定義されていたらdictと判別します。var = {}
と記述するとPythonはdictであると認識するので、要素数0のsetを定義するにはset()
関数で定義する必要があります。(set()
は型変換を行う際にも使われる関数です。)
setは必ずしも要素を持っている必要はなく、要素数0のsetで初期化した後で、add()
メソッドなどで要素を追加することができます。(要素を追加する方法は、専用のレクチャーで詳しく解説します。)
setは、要素の順番を保持しません。ですので、上記コードの6行目で定義した{'0', '1', '2'}
をprint出力すると{'2', '0', '1'}
のようになります。(※順序は保証されないため出力の順序は変わることがあります。)
setの要素にできるデータ型・できないデータ型
setの要素として追加できない、Pythonの標準ライブラリが提供するデータ型は次の通りです。これらのデータ構造は、要素を編集することが出来るという特徴を持ちます。(setの要素としてsetを追加することはできません。)
- list
- dict
- set
Pythonの標準ライブラリが提供する以下のデータ型は、setの要素として追加できます。これらは、値や要素を編集できないという特徴を持ちます。
- int/ float
- str
- tuple
- ただし、tupleの中の要素も編集不可なデータ型である必要があり、要素の中にlistやdictなどの編集可能なデータ型が存在している場合はエラーになります
setのネスト
先ほど説明した通り、setを別のsetの中にネストすることはできません。これは、直接的なものはもちろん、tupleの中にsetが存在しているような場合もエラーになります。
s1 = {1, (2, (3, 4))} # ✅ OK
s2 = {1, (2, {3, 4})} # ❌ エラー
上記のコードの場合、要素として他のtupleを含むtuple((2, (3, 4))
)は問題ありませんが、要素としてsetを含むtuple((2, {3, 4})
)はNGです。
複数のデータ型をもつset – int/float, str, tupleの混在
基本的にsetは、『数値だけのset』『文字列だけのset』のように、1つのsetに1種類のデータ型を持たせるのが分かりやすくて管理もしやすいのですが、次のコードのように異なったデータ型を1つのsetに持たせることができます。
mixed = {1, 'two', 3.0, (4, 4.0)}
print(mixed, type(mixed)) # {(4, 4.0), 1, 'two', 3.0} <class 'set'>
上記コードのsetには、int, string, float, tupleのデータ型が含まれています。このように、Pythonのsetは複数の種類のデータを簡単に管理することができます。
先ほど説明した通り、要素としてlist, dict, setを含めることはできません。
setの要素の取り出し – pop()でランダムに取得
setの要素は、listや文字列のように順番を保持していないので、[n]
のように記述して要素を取り出すことはできません。pop()
メソッドを使うと要素を1つ取り出すことは可能ですが、完全にランダムに取り出されることに注意が必要です。
mixed = {1, 'two', 3.0, (4, 4.0)}
print(mixed.pop()) # (4, 4.0)
print(mixed.pop()) # 1
print(mixed.pop()) # 3.0
print(mixed.pop()) # two
setの要素数 – len()関数で確認する方法
set要素数を確認するには、len()
関数を使用します。
mixed = {1, 'two', 3.0, (4, 4.0)}
print(len(mixed)) # 4