集合(set)

【Python】集合(set)の演算(積集合・和集合・差集合・排他的論理和)と包含関係の判定(上位集合・部分集合)

【Python】集合(set)の演算(積集合・和集合・差集合・排他的論理和)と包含関係の判定(上位集合・部分集合)

Pythonの集合(set) の演算(積集合・和集合・差集合・排他的論理和)の計算方法と集合の包含関係(上位集合・部分集合)の判定方法について解説します。

集合(set)の演算と包含関係の判定

集合(set)とは、プログラミングで用いられるデータの型の一種で、順序のないデータの集まりです。同一のデータは集合には一つしかないようなデータとなります。Pythonでも、集合はsetとして用意されています。

集合の演算としておさえておきたいのは、積集合和集合差集合排他的論理和といった種類があります。また、集合間の包含関係としては上位集合部分集合といった判定を必要とする場合があります。

本記事では、演算(積集合・和集合・差集合・排他的論理和)の計算方法と集合の包含関係(上位集合・部分集合)の判定方法について説明していきます。

集合(set)の演算

積集合の計算方法

積集合とは、集合が重なっている部分のことを言います。図で表すと以下で色を塗った部分になります。

Python 積集合 intersection

Pythonで積集合を計算する場合は、以下のように&演算子か、intersectionメソッドを使用します。

a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

# 積集合の計算
print(f"a & b: {a & b}")
print(f"a.intersection(b): {a.intersection(b)}")
print(f"b & a: {b & a}")
print(f"b.intersection(a): {b.intersection(a)}")
【実行結果】
a & b: {6, 7, 8, 9, 10}
a.intersection(b): {6, 7, 8, 9, 10}
b & a: {6, 7, 8, 9, 10}
b.intersection(a): {6, 7, 8, 9, 10}

上記結果を見てみると、aとbで重なっているデータが抽出できていることが分かります。なお、積集合はaを基準に実行しても、bを基準に実行しても同様です。

今回は数値サンプルで示していますが、例えば名前の集合など文字列の集合についても同様だと思ってください。

和集合の計算方法

和集合とは、いずれの集合も含む全体部分のことを言います。図で表すと以下で色を塗った部分になります。

Python 和集合 union

Pythonで和集合を計算する場合は、以下のように|演算子か、unionメソッドを使用します。

a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

# 和集合の計算
print(f'a | b: {a | b}')
print(f'a.union(b): {a.union(b)}')
print(f"b | a: {b | a}")
print(f'b.union(a): {b.union(a)}')
【実行結果】
a | b: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
a.union(b): {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
b | a: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
b.union(a): {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

上記結果を見てみると、aとbに含むデータを足した全体のデータが抽出できていることが分かります。なお、和集合はaを基準に実行しても、bを基準に実行しても同様です。

今回は数値サンプルで示していますが、例えば名前の集合など文字列の集合についても同様だと思ってください。

差集合の計算方法

差集合とは、片方の集合からもう片方の集合に含まれる要素を取り除いた部分のことを言います。図で表すと以下で色を塗った部分になります。

Python 差集合 difference

Pythonで和集合を計算する場合は、以下のように-演算子か、differenceメソッドを使用します。

a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

# 差集合の計算
print(f"a - b: {a - b}")
print(f"a.difference(b): {a.difference(b)}")
print(f"b - a: {b - a}")
print(f"b.difference(a): {b.difference(a)}")
【実行結果】
a - b: {1, 2, 3, 4, 5}
a.difference(b): {1, 2, 3, 4, 5}
b - a: {11, 12, 13, 14, 15}
b.difference(a): {11, 12, 13, 14, 15}

上記結果を見てみると、aとbの差に関するデータが抽出できていることが分かります。なお、差集合については、aを基準にする(a-b)か、bを基準にする(b-a)かで結果が異なることに注意しましょう。

今回は数値サンプルで示していますが、例えば名前の集合など文字列の集合についても同様だと思ってください。

排他的論理和の計算方法

排他的論理和とは、両方の集合の領域から集合が重なる部分を除いた部分のことを言います。図で表すと以下で色を塗った部分になります。

Python 排他的論理和 symmetric difference

Pythonで和集合を計算する場合は、以下のように^演算子か、symmetric_differenceメソッドを使用します。

a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

# 排他的論理和の計算
print(f'a ^ b: {a ^ b}')
print(f'a.symmetric_difference(b): {a.symmetric_difference(b)}')
print(f'b ^ a: {b ^ a}')
print(f'b.symmetric_difference(a): {b.symmetric_difference(a)}')
【実行結果】
a ^ b: {1, 2, 3, 4, 5, 11, 12, 13, 14, 15}
a.symmetric_difference(b): {1, 2, 3, 4, 5, 11, 12, 13, 14, 15}
b ^ a: {1, 2, 3, 4, 5, 11, 12, 13, 14, 15}
b.symmetric_difference(a): {1, 2, 3, 4, 5, 11, 12, 13, 14, 15}

上記結果を見てみると、aとbを足した部分から、重なっている部分を除いたデータが抽出できていることが分かります。なお、排他的論理和はaを基準に実行しても、bを基準に実行しても同様です。

今回は数値サンプルで示していますが、例えば名前の集合など文字列の集合についても同様だと思ってください。

集合(set)の包含関係の判定方法

集合を扱うときには集合の包含関係がどのようになっているか調べたくなることがあります。以下の図を使いつつ包含関係に関する用語をまず整理して、Pythonでの判定方法を見ていきましょう。

Python 上位集合 部分集合 issuperset issubset

上記の図で、集合aは集合bに含む要素をすべて持っています。この時、aはbの上位集合(スーパーセット)といいます。逆に、bはaの部分集合(サブセット)といいます。

また、aはbに含まない要素を持っている場合(全く同じ集合でない場合)は、aはbの真上位集合、bはaの真部分集合といいます。

集合が等しいか等しくないかの判定

Pythonで集合が等しいか等しくないかを判定する方法を以下の例を使ってみていきましょう。

# aとbは等しい
a = {1, 2, 3, 4, 5}
b = {1, 2, 3, 4, 5}

print("===== aとbが等しい場合")
print(f"a == b: {a == b}")
print(f"a != b: {a != b}")

# aとbは等しくない
a = {1, 2, 3, 4, 5}
b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

print("===== aとbが等しくない場合")
print(f"a == b: {a == b}")
print(f"a != b: {a != b}")
【実行結果】
===== aとbが等しい場合
a == b: True
a != b: False
===== aとbが等しくない場合
a == b: False
a != b: True

集合が等しいことを判定する場合は==演算子を、集合が等しくないことを判定する場合は、!=演算子を使用します。結果はTrue, Falseで判断することができます。

今回は数値サンプルで示していますが、例えば名前の集合など文字列の集合についても同様だと思ってください。

上位集合と真上位集合

Pythonで上位集合と真上位集合を判定する方法を以下の例を使ってみていきましょう。

# aはbの真上位集合
a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {1, 2, 3, 4, 5}

print("===== aはbの真上位集合である場合")
print(f"a >= b: {a >= b}")
print(f"a.issuperset(b): {a.issuperset(b)}")
print(f"a > b: {a > b}")

# aはbの上位集合であるが、真上位集合ではない
a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

print("===== aはbの上位集合であるが、真上位集合ではない場合")
print(f"a >= b: {a >= b}")
print(f"a.issuperset(b): {a.issuperset(b)}")
print(f"a > b: {a > b}")
【実行結果】
===== aはbの真上位集合である場合
a >= b: True
a.issuperset(b): True
a > b: True
===== aはbの上位集合であるが、真上位集合ではない場合
a >= b: True
a.issuperset(b): True
a > b: False

上位集合を判定する場合には、>=演算子といった比較演算を使用するか、issupersetメソッドを使用します。また、真上位集合かを判定する場合は、>演算子といった比較演算子を使用します。結果はTrue, Falseで判断することができます。

今回は数値サンプルで示していますが、例えば名前の集合など文字列の集合についても同様だと思ってください。

部分集合と真部分集合

Pythonで部分集合と真部分集合を判定する方法を以下の例を使ってみていきましょう。

# bはaの真部分集合
a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {1, 2, 3, 4, 5}

print("===== bはaの真部分集合である場合")
print(f"b <= a: {b <= a}")
print(f"b.issubset(a): {b.issubset(a)}")
print(f"b < a: {b < a}")

# bはaの部分集合であるが、真部分集合ではない
a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

print("===== bはaの部分集合であるが、真部分集合ではない場合")
print(f"b <= a: {b <= a}")
print(f"b.issubset(a): {b.issubset(a)}")
print(f"b < a: {b < a}")
【実行結果】
===== bはaの真部分集合である場合
b <= a: True
b.issubset(a): True
b < a: True
===== bはaの部分集合であるが、真部分集合ではない場合
b <= a: True
b.issubset(a): True
b < a: False

上位集合を判定する場合には、<=演算子といった比較演算を使用するか、issubsetメソッドを使用します。また、真上位集合かを判定する場合は、<演算を使用します。結果はTrue, Falseで判断することができます。

今回は数値サンプルで示していますが、例えば名前の集合など文字列の集合についても同様だと思ってください。

まとめ

Pythonの集合(set) の演算(積集合・和集合・差集合・排他的論理和)の計算方法と集合の包含関係(上位集合・部分集合)の判定方法について解説しました。

各種演算子を使用する方法とメソッドを使用する方法を紹介しています。