Pythonのsetで理解する集合の基礎

May 1st, 2021

集合とは

ある特定のものの集まりの事を集合と言い、その集合を構成する1つ1つのものの事を要素、または元と言う。

「リンゴ」というものは「果物」というを構成する要素の1つなので、リンゴは果物に属する、もしくはリンゴは果物の要素である、という風に言い、記号ではリンゴ果物リンゴ \in 果物と書く。また、要素が1つも存在しない集合を空集合と言い、記号では\varnothingと書く。

一意性と基礎的な演算

集合は、「属している要素は何か」だけによって一意に定まる。

つまり、集合の中で各要素がどのように並んでいるかは問題ではなく、「集合AAに属する全ての要素は全て集合BBに属してして、集合BBに属する全ての要素は全て集合AAに属しているとき、集合AABBは等しい」と定められている。

これを外延の公理と言い、任意の集合XXについて記号を用いて以下のように表される。(\forallは全称記号と読み、「全ての」という意味。\Leftrightarrowはif and only if、すなわち必要十分条件を表す。)


AB(X(XAXB)A=B)\forall A \forall B \left( \forall X \left( X \in A \Leftrightarrow X \in B \right) \Leftrightarrow A = B \right)

論理演算とPythonの対応

Pythonでは集合はset型として用意されており、集合の演算とは次のように対応している。


記号 読み Pythonの演算
\subset 部分集合(subset) A <= B
\cup 和集合(union) A \vert B
\cap 積集合(intersection) A & B
- 差集合(difference) A - B

Pythonで上記の演算をする方法を紹介する前に、まずはset型のオブジェクトの基本的な扱い方を紹介する。


Pythonで集合


リストやタプルのような可変長型のオブジェクトに対してset()をすると、Pythonで集合を扱う事ができる。

arr = [1,2,3,4,5]
arr_set = set(arr)

print(arr_set)
# {1, 2, 3, 4, 5}

空集合\varnothingを呼び出したい時は、引数を省略すればよい。

arr_set = set()

print(arr_set)
# set()

集合に要素の追加、削除


Pythonでset型に値を追加する際は、addを使う

arr_set = set()
arr_set.add(1)
# {1}

addは引数を1つしかとる事ができないので、複数の値が入ったリストを集合に足したい場合はupdateを使う。

arr_set = {1,2,3}
arr = [4,5,6]

arr_set.update(arr)

print(arr_set)
# {1, 2, 3, 4, 5, 6}

集合からある特定の要素を削除したい場合は、discardを使う。

arr_set = {1,2,3}

arr_set.discard(2)

print(arr_set)
# {1, 3}

全ての要素を削除して空集合にする場合は、clearを使う。

arr_set = {1,2,3}

arr_set.clear()

print(arr_set)
# set()

部分集合

集合AABBにおいてAAの全ての要素がBBの要素である時、AABBの部分集合であるといい、次のように書く。


AB A \subset B

Pythonで部分集合かを確かめたい時は<=、もしくはissubsetを使う。戻り値はBoolean型。

arr_set = {1,2,3}
arr_set2 = {1,2}

print(arr_set2 <= arr_set)
print(arr_set2.issubset(arr_set))
# True
# True

和集合

集合AABBにおいてAAの要素とBBの要素を全て集めた集合をAABBの和集合といい、次のように書く。


AB={xxAまたはxB} A \cup B = \{ x | x \in A または x \in B \}

Pythonで和集合を求めたいときは|もしくはunionを使う。

arr_set = {1,2,3}
arr_set2 = {4,5,6}

print(arr_set2 | arr_set)
print(arr_set2.union(arr_set))
# {1, 2, 3, 4, 5, 6}
# {1, 2, 3, 4, 5, 6}

積集合

集合AABBにおいてAABBの両方に共通する要素の集合を積集合、または共通部分といい、次のように書く。


AB={xxAかつxB} A \cap B = \{ x | x \in A かつ x \in B \}

Pythonで和集合を求めたいときは&もしくはintersectionを使う。

arr_set = {1,2,3}
arr_set2 = {2,3,4}

print(arr_set2 & arr_set)
print(arr_set2.intersection(arr_set))
# {2, 3}
# {2, 3}

差集合

集合AABBにおいてAAに属しBBに属さない要素の集合を差集合といい、次のように書く。


AB={xxAかつxB} A - B = \{ x | x \in A かつ x \notin B \}

Pythonで差集合を求めたいときは-もしくはdifferenceを使う。

arr_set = {1,2,3}
arr_set2 = {2,3,4}

print(arr_set2 - arr_set)
print(arr_set2.difference(arr_set))
# {4}
# {4}