sec02 - 【初心者向け】Pythonのset(集合)とは?基本と使い方まとめ
スポンサーリンク

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は、波カッコの中で単純に要素がカンマで区切られていたらsetkey: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
スポンサーリンク