set型と集合演算

setのメリットは何でしょうか?set型はlistと比較して順序を保てないというデメリットを感じますが、要素がユニークであるため集合演算を行うことができるというlistにはない特徴があります。このページではset型の集合演算について学びます。

setの集合演算

それではsetの集合演算について見ていきましょう。基本となるUnion、Intersection、Differenceと包含関係の判定について説明します。

Union(和集合)

2つの集合の和を取ります。setオブジェクトがもつunionメソッドを利用します。戻り値にunionした新たなsetが返されます。もとのsetには変更ありません。

union
setオブジェクト1.union(setオブジェクト2)
s1 = {'A', 'B', 'C'}
s2 = {'C', 'D', 'E'}
s = s1.union(s2) # s1とs2をunionする
print(s) # {'E', 'D', 'C', 'B', 'A'}
print(s1) # {'B', 'A', 'C'} 変更なし

Intersection(積集合)

2つの集合の積、つまり共通要素を取り出します。setオブジェクトがもつintersectionメソッドを利用します。

intersection
setオブジェクト1.intersection(setオブジェクト2)
s1 = {'A', 'B', 'C'}
s2 = {'C', 'D', 'E'}
s = s1.intersection(s2)
print(s) # {'C'}

Difference(差集合)

2つの集合の差、つまり元の集合に存在し、比較対象の集合に存在しない要素を取得します。setオブジェクトがもつdifferenceメソッドを利用します。

difference
setオブジェクト1.difference(setオブジェクト2)

uniot、intersectionと異なり、演算順序で違いがあるので注意してください。

s1 = {'A', 'B', 'C'}
s2 = {'C', 'D', 'E'}

# s1 - s2
s = s1.difference(s2)
print(s) # {'B', 'A'}

# s2 - s1
s = s2.difference(s1)
print(s) # {'D', 'E'}

以下の計算となり、演算順序で違いが出ていることが確認できます。注意してください。
s1 – s2 = s1にあってs2にないもの = A, B
s2 – s1 = s2にあってs1にないもの = D, E

包含判定

ある集合が別の集合を含むかどうか、または含まれるかどうかを判定するメソッドがsetオブジェクトに用意されています。

含まれているかどうかを判定

ある集合s1が別の集合s2に含まれている場合、s1はs2のsubset(サブセット=部分集合)であるといいます。
setオブジェクトのissubsetメソッドを利用して判定することができます。

issubset
setオブジェクト1.issubset(setオブジェクト2)
s1 = {'A', 'B'}
s2 = {'A', 'B', 'C'}
s1.issubset(s2) # True

s1はs2の部分集合なので、Trueが返されています。

含んでいるかどうかを判定

ある集合s1が別の集合s2に含まれている場合、s1はs2のsuperset(スーパーセット)であるといいます。スーパーセットを上位集合と訳すこともありますが、和訳を見かけることは少ないですね。少し話がそれましたが、setオブジェクトのissupersetメソッドを利用して判定することができます。

issuperset
setオブジェクト1.issuperset(setオブジェクト2)
s1 = {'A', 'B', 'C'}
s2 = {'A', 'B'}
s1.issuperset(s2) # True

s2はs1の部分集合なので、Trueとなります。