この記事では、Pythonのset(セット)の使い方を解説します。
set
とは、リストのように複数の要素を格納できるコレクションの一種です。リストと異なる点は、重複する要素を持てないことです。
また、集合演算することもできます。
それでは、set
の使い方を見ていきましょう❗️
set(セット)とは?
set
とは、重複する要素を持てないコレクションです。要素を追加・削除・更新することができますが、重複する要素が格納されると片方の要素が削除されます。
set
は、「集合」とも呼ばれ、集合演算に用いられます。
また、重複する要素を持てない性質を利用してリストやタプルなどを一時的にset
に変換することで、重複する要素をまとめて取り除くこともできます。
更新できないset
である「frozenset」もあります。
- 可変(ミュータブル)
- 重複する要素を持てない
- 並びを保持しない
- 集合演算ができる
setの生成
set
を生成するには、set()
を使います。
変数名 = set()
{}
内に要素を,(カンマ)
区切りで指定することで初期値を指定できます。
変数名 = {要素1, 要素2, ..., 要素N}
試しにset
を生成・出力してみます。
# setの生成
s = {1, 2, 3, 1, 2, 4}
print(s)
print(type(s))
実行結果
{1, 2, 3, 4}
<class 'set'>
{}
を空のまま代入すると辞書として見なされてしまうので注意してください。
s = {}
print(s)
print(type(s))
実行結果
{}
<class 'dict'>
要素の取得
set
は、シーケンスではない(順序を保持しない)ので[]
を使ってインデックスを指定し、要素にアクセスすることができません。
なので、要素を取得したい場合は、一時的にリストやタプルに変換するか、for
文を使って要素を取得する必要があります。
# set初期化
s = {1, 2, 3}
# リストに型変換する
s_list = list(s)
print(s_list[0])
# for文を使う
for val in s:
print(val)
ちなみに、[]
を使ってインデックスでアクセスするとTypeError
が送出される。
s = {1, 2, 3}
print(s[0])
実行結果
Traceback (most recent call last):
File "/Users/user/Desktop/Python/test.py", line 2, in
print(s[0])
TypeError: 'set' object is not subscriptable
要素の追加
set
に要素を追加するには、以下のような方法があります。
任意の要素の追加[add]
add()
メソッドを使って任意の要素を追加できます。
set.add(追加する要素)
サンプル
set
に要素を追加して出力してみます。
vals = {1, 2, 3}
# 4を追加
vals.add(4)
print(vals)
# 重複している要素を追加してみる
vals.add(1)
print(vals)
実行結果
{1, 2, 3, 4}
{1, 2, 3, 4}
複数の要素の追加[update]
update()
メソッドの引数にリストやタプルなどを指定することで複数の要素を一度にまとめて追加することができます。
set.update(追加するコレクション)
サンプル
試しに複数の要素を追加してみます。
vals = {1, 2, 3}
vals.update([1, 4])
print(vals)
実行結果
{1, 2, 3, 4}
要素の削除
set
の要素を削除するには、以下のような方法があります。
任意の要素の削除[remove] [discard]
remove()
メソッド、またはdiscard()
メソッドを使うことで任意の要素を削除することができます。指定した要素が set
内に存在しなかった場合、discard()
メソッドはエラーが発生しませんが、remove()
メソッド はKeyError
が送出されます。
set.remove(削除したい要素)
set.discard(削除したい要素)
サンプル
試しに要素を削除してみます。その中でdiscard()
メソッドの引数に存在しない要素を指定してもエラーが起きないか試してみます。
vals = {1, 2, 3}
# 2を削除
vals.remove(2)
# 存在しない要素を指定
vals.discard(5)
print(vals)
実行結果
{1, 3}
先頭の要素を取り出す[pop]
pop()
メソッドを使うことで先頭の要素を取り出せます。どの要素を取り出すかは指定できないので注意してください。
set.pop()
サンプル
試しにpop()
メソッドを使って先頭の要素を取り出してみます。
vals = {1, 2, 3}
val = vals.pop()
print(val)
val = vals.pop()
print(val)
val = vals.pop()
print(val)
print(vals)
実行結果
1
2
3
set()
set
が空のときに使うとKeyError
が送出される。
vals = set()
vals.pop()
実行結果
Traceback (most recent call last):
File "/Users/user/Desktop/Python/test.py", line 2, in
vals.pop()
KeyError: 'pop from an empty set'
全ての要素を削除する[clear]
clear()
メソッド を使うことで全ての要素を削除することができます。
set.clear()
サンプル
試しに全ての要素を削除してみます。
vals = {1, 2, 3}
vals.clear()
print(vals)
実行結果
set()
長さの取得[len]
len()
関数を使うことで長さを取得できます。
len(set)
サンプル
set
の長さを出力してみます。
vals = {1, 2, 3}
print(len(vals))
実行結果
3
集合演算
set
で集合演算する方法を紹介します。
和集合[union][|]
和集合を求めるには、union()
メソッド、または|
演算子を使います。
set.union(配列)
set1 | set2
和集合とは「どちらか片方には存在する要素」を集めます。
図で表すと以下のようになります。

サンプル
試しに和集合を計算してみましょう。
vals1 = {1, 2}
vals2 = {3, 4}
union = vals1.union(vals2)
print(union)
union = vals1 | vals2
print(union)
実行結果
{1, 2, 3, 4}
{1, 2, 3, 4}
union()
メソッドには、複数の配列を指定可能でリスト・タプルも指定できます。
vals1 = {1, 2}
vals2 = {3, 4}
union = vals1.union(vals2, [5, 6], (7, 8))
print(union)
実行結果
{1, 2, 3, 4, 5, 6, 7, 8}
積集合[intersection][&]
積集合を求めるには、intersection()
メソッド、または&
演算子を使います。
set.intersection(配列)
set1 & set2
積集合とは、「両方に入っている要素」を集めます。
図で表すと以下のようになります。

サンプル
試しに積集合を計算してみましょう。
vals1 = {1, 2, 3}
vals2 = {2, 3, 4}
intersection = vals1.intersection(vals2)
print(intersection)
intersection = vals1 & vals2
print(intersection)
実行結果
{2, 3}
{2, 3}
intersection()
メソッドには複数の配列を指定可能でリスト・タプルも指定できます。
vals1 = {1, 2, 3, 4}
vals2 = {2, 3, 4, 5}
intersection = vals1.intersection(vals2, [3, 4, 5, 6], (4, 5, 6, 7))
print(intersection)
実行結果
{4}
差集合[difference][-]
差集合を求めるには、difference()
メソッド、またはー
演算子を使います。
set.difference(配列)
set1 - set2
差集合とは「ある集合から別の集合の要素を取り除いて残った要素」を集めます。
図で表すと以下のようになります。

サンプル
試しに差集合を計算してみましょう。
vals1 = {1, 2, 3}
vals2 = {2, 3, 4}
difference = vals1.difference(vals2)
print(difference)
difference = vals1 - vals2
print(difference)
実行結果
{1}
{1}
difference()
メソッドは、複数の配列を指定可能でリスト・タプルも指定できます。
vals = {1, 2, 3, 4, 5}
difference = vals.difference([2, 3], (4, 5))
print(difference)
実行結果
{1}
対称差集合[symmetric_difference][^]
対象差集合を求めるには、symmetric_difference()
メソッド、または^
演算子を使います。
set1.symmetric_difference(set2)
set1 ^ set2
対称差集合とは「どちらか片方のみに存在する要素」を集めます。
図で表すと以下のようになります。

サンプル
試しに対称差集合を計算してみましょう。
vals1 = {1, 2, 3}
vals2 = {2, 3, 4}
s_d = vals1.symmetric_difference(vals2)
print(s_d)
s_d = vals1 ^ vals2
print(s_d)
実行結果
{1, 4}
{1, 4}
symmetric_difference()
メソッドは、同時に複数の配列を指定できません。さらに、他のメソッドとは違いset
同士でしか計算できません。
同時に複数の計算がしたい場合は演算子を使ってください。
vals1 = {1, 2, 3}
vals2 = {2, 3, 4}
s_d = vals1 ^ vals2 ^ {3, 4, 5}
print(s_d)
実行結果
{1, 3, 5}
まとめ
この記事では、Pythonのset(集合)の使い方を解説をしました。
setを使うことでコレクション内の重複している要素をまとめて削除できたり、集合演算することができました。集合演算にのみに使用したい場合は、frozensetを使うことでより効率良く行うことができます!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ