Pythonのデータ構造「セット」は、順序づけされていないユニーク(一意)な値の集合を扱う時に使う。

リストやディクショナリと似ているが、値を持たずキーのみを管理する。

セットの定義

セットを作る方法は、まずset関数を使う方法がある。
引数にリストを指定すると、重複した値が除かれたユニークな値だけがセットとして作られる。

s = set([1, 1, 3, 3, 3, 3, 2])
s # {1, 2, 3}

また、中括弧を使っても同様にセットを作ることができる。

s = {1, 1, 3, 3, 3, 3, 2}
s # {1, 2, 3}

複数のセットで集合演算をおこなう

セットでは数学の集合演算をおこなうことができる。

複数のセットを用意して実際にサンプルコードを見てみよう。

和集合を求める

和集合は「|」演算子、またはunionメソッドを使うことで求めることができる。

それぞれのセットを結合し、重複のない要素で構成されるセットを返す。

s1 = {1, 2, 3}
s2 = {2, 3, 4, 5}

s1 | s2 # {1, 2, 3, 4, 5}
s1.union(s2) # {1, 2, 3, 4, 5}

積集合を求める

積集合は「&」演算子、またはintersectionメソッドを使う。

それぞれのセットで共通した値のみで構成されるセットを返す。

s1 = {1, 2, 3}
s2 = {2, 3, 4, 5}

s1 & s2 # {2, 3}
s1.intersection(s2) # {2, 3}

セットでよく使われるその他のメソッド

unionメソッド、intersectionメソッドを理解しておけば、基本の集合演算はおこなうことができるが、ここではその他のメソッドについても簡単に紹介しておく。

addメソッド

引数に指定した要素をセットに追加する。

s1 = {1, 2, 3}

s1.add(4)
s1 # {1, 2, 3, 4}

clearメソッド

セット内の要素を空にする。

s1 = {1, 2, 3}

s1.clear()
s1 # set()

removeメソッド

引数に指定した要素を削除する。

s1 = {1, 2, 3}

s1.remove(2)
s1 # {1, 3}

differenceメソッド

引数に指定したセットに含まれない値を返す。

s1 = {1, 2, 3}
s2 = {3, 4, 5}

s1.difference(s2) # {1, 2}

symmetric_differenceメソッド

引数に指定したセットと両方に含まれる値を除いた全ての要素を返す。

s1 = {1, 2, 3}
s2 = {3, 4, 5}

s1.symmetric_difference(s2) # {1, 2, 4, 5}

issubsetメソッド

元のセットが、引数に指定したセットに全て含まれていればTrueを返す。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3}

s1.issubset(s2) # False
s1.issubset(s3) # True

issupersetメソッド

指定したセットが、元のセットに全て含まれていればTrueを返す。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3}

s1.issuperset(s2) # False
s1.issuperset(s3) # True

isdisjointメソッド

元のセットと指定したセットの両方に共通の値が一つもないときにTrueを返す。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {4, 5, 6}

s1.isdisjoint(s2) # False
s1.isdisjoint(s3) # True

まとめ

本記事で紹介したセットの数々のメソッドについて、当然全てを覚える必要はない。

しかし、ここに紹介した集合演算はプログラミングにおいて非常に便利な機能である。
集合演算でこんなことができる、とまずはなんとなく覚えておき、いざという時にググれる能力さえ持ち合わせていれば何の問題もないだろう。