[Python] 図を見て理解するPythonの集合型演算

Set型の集合演算を目で見て理解しましょう。
2024.05.27

こんにちは。サービス開発室の武田です。

プログラミング言語にはデータ構造がありますね。代表的なものとしては配列があり、リスト、連想配列、そしてセットがあります。連想配列は言語によって、辞書とかマップとかハッシュなどとも呼ばれたりします。またこれらは複数の値をまとめて管理できるためコレクションあるいはコンテナと呼ばれることもあります。

Pythonでは組込み型のコレクションとしてリスト、タプル、辞書、セットなどを提供していますが、特にセットの知名度が低いと感じています。セットは 集合型 と訳されますが、いわゆる 数学の集合 の概念で値を操作できる型です。集合といえば ベン図 ですよね。そんなわけで、目で見て操作の概要を把握しましょう。

なお操作全般についてはこちらのエントリにまとまっていますので、こちらも参考にしてください。

真偽判定

2つの集合の関係について真偽判定をします。

isdisjoint

2つの集合が共通の要素を持たないときTrueを返します。「積集合が空集合」を判定しているとも言えます。disjointは「互いに素」という意味です。

>>> a = {1, 3, 5}
>>> b = {2, 4, 6}
>>> a.isdisjoint(b)
True

issubset, <=

集合が、対象の集合の部分集合であるときTrueを返します。「部分集合」であるとは、集合のすべての要素が対象の集合に含まれていることをいいます。なお2つの集合が等しい場合も、部分集合となります。

>>> a = {2, 4, 6}
>>> b = {1, 2, 3, 4, 5, 6}
>>> a.issubset(b)
True
>>> a <= b
Tru

>>> b = {2, 4, 6}
>>> a <= b
True

<

集合が、対象の集合の真部分集合であるときTrueを返します。「真部分集合」であるとは、集合のすべての要素が対象の集合に含まれ、かつ2つの集合が等しくないことをいいます。

>>> a = {2, 4, 6}
>>> b = {1, 2, 3, 4, 5, 6}
>>> a < b
True

>>> b = {2, 4, 6}
>>> a < b
False

issuperset, >=

集合が、対象の集合の上位集合であるときTrueを返します。「上位集合」であるとは、対象の集合のすべての要素が集合に含まれていることをいいます。部分集合の逆ですね。なお2つの集合が等しい場合も、上位集合となります。

>>> a = {1, 2, 3, 4, 5, 6}
>>> b = {2, 4, 6}
>>> a.issuperset(b)
True
>>> a >= b
Tru

>>> a = {2, 4, 6}
>>> a >= b
True

>

集合が、対象の集合の真上位集合であるときTrueを返します。「真上位集合」であるとは、対象の集合のすべての要素が集合に含まれ、かつ2つの集合が等しくないことをいいます。真部分集合の逆です。

>>> a = {1, 2, 3, 4, 5, 6}
>>> b = {2, 4, 6}
>>> a > b
True

>>> a = {2, 4, 6}
>>> a > b
False

集合演算

2つの集合の要素から、新しい集合を作ります。

union, |

2つの集合の和集合を返します。「和集合」とは、それぞれの集合の要素をすべてもつ集合です。

>>> {1, 2, 3, 4}.union({3, 4, 5, 6})
{1, 2, 3, 4, 5, 6}
>>> {1, 2, 3, 4} | {3, 4, 5, 6}
{1, 2, 3, 4, 5, 6}

intersection, &

2つの集合の積集合を返します。「積集合」とは、それぞれの集合の両方に含まれる要素だけをもつ集合です。

>>> {1, 2, 3, 4}.intersection({3, 4, 5, 6})
{3, 4}
>>> {1, 2, 3, 4} & {3, 4, 5, 6}
{3, 4}

difference, -

2つの集合の差集合を返します。「差集合」とは、集合から対象の集合の要素を除いた要素をもつ集合です。

>>> {1, 2, 3, 4}.difference({3, 4, 5, 6})
{1, 2}
>>> {1, 2, 3, 4} - {3, 4, 5, 6}
{1, 2}

symmetric_difference, ^

2つの集合の対称差集合を返します。「対称差集合」とは、いずれかの集合のみ含まれる要素をもつ集合です。「和集合と積集合の差集合」を求めるのと同じです。

>>> {1, 2, 3, 4}.symmetric_difference({3, 4, 5, 6})
{1, 2, 5, 6}
>>> {1, 2, 3, 4} ^ {3, 4, 5, 6}
{1, 2, 5, 6}

>>> a = {1, 2, 3, 4}
>>> b = {3, 4, 5, 6}
>>> (a | b) - (a & b)
{1, 2, 5, 6}

まとめ

なんとなく「集合演算」がわからずセットの利用を避けていたような方がいましたら、ぜひ使ってみてください。