EnsekiTT Blog

EnsekiTTが書くブログです。

Pythonで集合を扱う話

こんにちは、えんせきです。
今日も小ネタです。インフルエンザ明けて始めてお酒を飲みに行きました。ビールはうまいですね。

つまりなにしたの?

例えばCrossVaridationをするときとかにデータセットの1/10と9/10に分けるとかをより柔軟にやろうと思ったら
setを使うのが便利だと思っていて今日はそれを紹介する。
f:id:ensekitt:20180208021315j:plain

なんでやったの

リファレンスにももちろん書いてある。ただ、さくっと実行例が見たいし、なんだかんだで毎回Jupyter Notebookで動作を確認しているので
ブログにまとめることにした

扱うこと

  • 集合を作る
  • 素数を取得する
  • 要素の追加と削除
  • 和・積・差・対称
  • 要素を含むかの判定
  • 集合が集合に含まれるかの判定

集合を作る

>>> s = set([1,2,3,4,5,4,3])
>>> print(s)
{1, 2, 3, 4, 5}

普通にリストを渡すと重複要素を除いた集合にしてくれる。故にDataFrameのインデックスとかで使いやすい。

素数を取得する

>>> len(s)
5

リストとかと同じ

要素の追加と削除

>>> s.add(6)
>>> s.remove(2)
>>> print(s)
{1, 3, 4, 5, 6}

要素がない可能性がある時はremoveの代わりにdiscardを使うとKeyErrorが出ない。

和・積・差・対称

>>> s1 = set([1,2,3,4,5])
>>> s2 = set([9,8,7,5,3])

>>> # 和集合
>>> print(s1 |  s2)
{1, 2, 3, 4, 5, 7, 8, 9}
>>> print(s1.union(s2))
{1, 2, 3, 4, 5, 7, 8, 9}

>>> # 積集合
>>> print(s1 & s2)
{3, 5}
>>> print(s1.intersection(s2))
{3, 5}

>>> # 差集合
>>> print(s1 - s2)
{1, 2, 4}
>>> print(s1.difference(s2))
{1, 2, 4}

>>> #  対称差
>>> print(s1 ^ s2)
{1, 2, 4, 7, 8, 9}
>>> print(s1.symmetric_difference(s2))
{1, 2, 4, 7, 8, 9}

差集合をよく使う。母集合があれば補集合にできる。

要素を含むかの判定

>>> # 含まれるかの判定
>>> print(5 in s1)
True

>>> # 含まれないかの判定
>>> print(5 not in s1)
False

あんまり使わない。Listのままでできるから

集合が集合に含まれるかの判定

>>> s3 = set([1,2,3,4,5,6,7,8,9])
>>> s4 = set([4,5,6])

>>> # 集合s4が集合s3に含まれているかの判定
>>> print(s4.issubset(s3))
True
>>> print(s4 <= s3)
True
>>> # 真部分集合の判定
>>> print(s4 < s3)
True
>>> print(s4 < s4)
False

>>> # 集合s4の全ての要素が集合s3に含まれるか判定
>>> print(s3.issuperset(s4))
True
>>> print(s3 >= s4)
True
>>> # 真上位集合の判定
>>> print(s3 > s4)
True
>>> print(s4 > s4)
False

変な集合が出てきたときになんかの集合に全部突っ込まれた集合があるのか確認する時に使う。

リファレンス

4. 組み込み型 — Python 3.6.3 ドキュメント
(当然こちらを読むべき。ただ僕は忘れた時にこれを見ると動作を確認しちゃう)