集合 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
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る