TIL

Today I Learned. 知ったこと、学んだことを書いていく

集合 set - Python

Pythonでの集合はset()関数を使う。

集合の使い時は「順序は関係なし、要素が重複したくない」とき。

集合についてはこちらが分かりやすかった。

空の集合の作成

>>> empty_set = set()

>>> empty_set
set()

{}での作成

>>> even_numbers = {2, 4, 6, 1, 5}

>>> even_numbers
{1, 2, 4, 5, 6}

順序は無いため、作成時と変わっている。

他の型からの変換

str -> set

>>> set('hello')
{'e', 'h', 'o', 'l'}

list -> set

>>> set(['apple', 'lemon', 'banana'])
{'apple', 'banana', 'lemon'}

tuple -> set

>>> set(('こんにちは', 'さようなら', 'おはよう'))
{'おはよう', 'こんにちは', 'さようなら'}

dict -> set

キーだけのsetができる。

>>> set({'apple': 'red', 'orange': 'orange', 'cherry': 'red'})
{'apple', 'cherry', 'orange'}

要素に含まれているかの確認

inを使えばいい。含まれていればTrue、そうでなければFalseを返す。

>>> fruits = {'banana', 'apple', 'lemon', 'melon'}

>>> fruits
{'banana', 'lemon', 'melon', 'apple'}

>>> 'apple' in fruits
True

>>> 'peach' in fruits
False

複雑な条件での確認

要素がstrとsetのfoodsという辞書を用意する。

>>> foods = {
...     'カレー': {'じゃがいも', '人参', '肉'},
...     'オムライス': {'卵', 'ケチャップ', '肉'},
...     'にくじゃが': {'じゃがいも', 'さやえんどう', 'しらたき', '肉'}}

材料に「じゃがいも」が入っているメニューのみ表示したいとき

>>> for menu, material in foods.items():
...     if 'じゃがいも' in material:
...         print(menu)
カレー
にくじゃが

材料に「じゃがいも」が入っていて、「さやえんどう」と「しらたき」が入っていないメニューを表示したいとき

>>> for menu, material in foods.items():
...     if 'じゃがいも' in material and not ('さやえんどう' in material or
...         'しらたき' in material):
...         print(menu)
カレー

条件がすごいわかりづらい...

演算子を使った確認

先程の条件と同じ意味になる。

>>> for menu, material in foods.items():
...     if 'じゃがいも' in material and not material & {'さやえんどう', 'しらたき'}:
...        print(menu)
カレー

演算子についてはこの次に説明がある。

集合の演算子

集合演算の説明のために前のカレーとにくじゃがの材料を変数に入れておく。

>>> curry = foods['カレー']

>>> nikujaga = foods['にくじゃが']

>>> curry
{'じゃがいも', '人参', '肉'}

>>> nikujaga
{'しらたき', 'じゃがいも', '肉', 'さやえんどう'}

積集合(AND)

積集合とは、両方の集合のどちらにも含まれている要素の集合のこと。

積集合を表すには&を使うか、setのintersection()関数を使う。

>>> a = {1, 2}

>>> b = {2, 3}

>>> a & b
{2}

>>> a.intersection(b)
{2}

>>> curry & nikujaga
{'じゃがいも', '肉'}

また、If文の条件で集合演算を行うことで、空要素の場合にはFalse、それ以外の場合にはTrueという事ができる。

>>> if a & b:
...     print(True)
True

和集合(OR)

和集合とは、どちらかの集合に含まれている要素の集合のこと。

和集合を表すには|を使うか、setのunion()関数を使う。

>>> a | b
{1, 2, 3}

>>> a.union(b)
{1, 2, 3}

>>> curry | nikujaga
{'さやえんどう', 'しらたき', '人参', 'じゃがいも', '肉'}

差集合

差集合とは、1つ目の集合には含まれていて、2つ目の集合には含まれていない要素の集合のこと。例)Aには含まれていて、Bには含まれていない要素の集合

差集合を表すには-を使うか、setのdifference()関数を使う。

>>> a - b
{1}

>>> a.difference(b)
{1}

>>> curry - nikujaga
{'人参'}

>>> nikujaga - curry
{'さやえんどう', 'しらたき'}

排他的OR (XOR)

排他的ORとは、どちらか一方にしか含まれていない要素の集合のこと。

排他的ORを表すには^を使うか、setのsymmetric_difference()関数を使う。

>>> a ^ b
{1, 3}

>>> a.symmetric_difference(b)
{1, 3}

>>> curry ^ nikujaga
{'人参', 'さやえんどう', 'しらたき'}

部分集合チェック

部分集合とは、たとえばAの集合の要素がBの集合にすべて含まれているとき、それはAはBの部分集合であると言える。

部分集合であるかどうかは<=を使うか、setのissubset()関数を使う。(is sub set ってことか!!)

要素が1のみの集合が含まれているかをチェックしてみた。

>>> {1} <= a
True

>>> {1}.issubset(a)
True

>>> a <= a
True    # 自分自身を確認した場合には必ずTrueになる。

真部分集合のチェック

真部分集合とは、たとえばAの集合の要素がBの集合にすべて含まれていて、さらに他の要素が存在するとき、それはAはBの真部分集合であると言える。

真部分集合であるかどうかは<を使って確認する。

>>> {1} < a
True

>>> {1, 2} < a
False

上位集合のチェック

上位集合とは、部分集合の逆のことで、2つ目の集合に1つ目の集合の要素が全て含まれているときに、上位集合であるといえる。

上位集合であるかは>=を使うか、setのissuperset()関数を使う。

>>> a >= {1}
True

>>> a >= a
True

>>> a.issuperset({1})
True

集合論

入門 Python 3

入門 Python 3