集合(set)
Python には集合を扱う集合型(set)があります。
集合型には2つの種類がある
要素の順序は保持していない
重複要素は取り除かれる
集合型データの操作
set型を生成するためには、組み込み関数 set() およびfronzenset()を使います。
code: 0223_generate_set.py
data = set()
print(type(data))
data = frozenset()
print(type(data))
{}でset型を定義することもできますが、要素がない場合はdict型になるので注意が必要です。
code: 0224_generate_set_other_way.py
data = {3, 3, 2, 1, 2, 1}
print(type(data))
print(data)
data = {}
print(type(data))
不変型オブジェクトであれば、異なる型のオブジェクトを要素にできますが、等価なデータは重複しているとみなされます。
set型オブジェクトは可変型オブジェクトを要素にできないので、次のコードはエラーになります。
code: 0225_set_is_inmutable.py
print(type(data))
この場合は、次のようにset() あるいはfronzenset()関数を使うとリストから要素を取り出してset型オブジェクトにすることができます。
code: 0226_frozenset.py
print(type(data))
print(type(data))
set型に限らず オブジェクトを初期化する場合は、それを明示的に表す組み込み関数を
使うことをおすすめします。
例: aList = [] ではなく aList = list()
集合型オブジェクトに要素を追加
set型オブジェクトに要素の追加するためにた2つの方法があります。
add(): 1つの要素を集合に追加する
update() : イテラブルオブジェクトの要素を集合に追加する
これらのメソッドはfronzenset型にはないのでエラーになります。
code: 0227_frozenset_restriction_add.py
print( 'add' in dir(data))
print( 'add' in dir(data))
data.add(5)
print(data)
data.add(5)
print(data)
update() メソッドはリストやタプルなどのイテラブルオブジェクトから要素を取り出して、集合に追加します。int型などイテラブルオブジェクトで無いものを与えるとエラーになります。
code: 0228_frozenset_restriction_update.py
print( 'update' in dir(data))
print( 'update' in dir(data))
print(data)
data.update((3, 6))
print(data)
data.update('Python')
print(data)
data.update(1)
print(data)
集合型オブジェクトの要素を削除
set型オブジェクトから要素を削除するためにはいくつかの方法があります。
remove(): 指定した要素を削除。要素が存在しないとエラーになる。
discard(): 指定した要素を削除。要素が存在しないと何もしない。
pop(): 要素を削除しその値を返す。要素は指定できない。空集合だとエラーになる。
clear(): 要素をすべて削除して空集合にする。
これらのメソッドはfronzenset型にはないのでエラーになります。
code: 0229_frozenset_restriction_remove.py
print( 'remove' in dir(data))
print( 'remove' in dir(data))
data.remove(3)
print(data)
data.remove(5)
print(data)
code: 0230_frozenset_restriction_discard.py
print( 'discard' in dir(data))
print( 'discard' in dir(data))
data.discard(3)
print(data)
data.discard(5)
print(data)
code: 0231_frozenset_restriction_pop.py
print( 'pop' in dir(data))
print( 'pop' in dir(data))
for n in data.len():
d = data.pop()
print(data)
print(a)
集合演算子
集合演算子には次のものがあります。
code:0232_set_operators.py
print(a | b) # 和集合: 重複要素を除外 a.union(b)
print(a & b) # 積集合: 重複した要素だけを抽出 a.intersection(b)
print(a - b) # 差集合: a から b の要素を除外 a.difference(b)
print(a ^ b) # 対象差集合: a.symmetric_difference(b)
# 「a に属し b に属さない要素」と「b に属し、a に属さない要素」を抽出
これらは該当するメソッドを呼び出して処理することもできます。
code: 0233_set_methods.py
print(a.union(b)) # a | b
print(a.intersection(b)) # a & b
print(a.difference(b)) # a - b
print(a.symmetric_difference(b)) # a ^ b
code: bash
$ python 0232_set_operators.py
{1, 2, 3, 4, 5}
{3}
{1, 2}
{1, 2, 4, 5}
$ python 0233_set_methods.py
{1, 2, 3, 4, 5}
{3}
{1, 2}
{1, 2, 4, 5}
次のように累積演算をすることもできます。
code: 0234_set_operators_cumulative.py
a |= b # a = a | b
print(a)
a &= b # a = a & b
print(a)
a -= b # a = a - b
print(a)
a ^= b # a = a ^ b
print(a)
部分集合と上位集合
次のように記述すると部分集合あるいは上位集合かどうかを調べることができます。
code: 0235_superset_subset.py
print('a :', a)
print('b :', b)
print('c :', c)
print('d :', d)
print('a > c :',a > c) # a が c の上位集合ならTrue a.issuperset(c)
print('b > c :',b > c)
print('a > b :',a > b)
print('c > c :',c > c)
print('a >= c :',a >= c) # a が c の上位集合ならTrue a.issuperset(c)
print('b >= c :',b >= c)
print('a >= b :',a >= b)
print('c >= c :',c >= c)
print('a < c :',a < c) # a が c の部分集合ならTrue a.issubset(c)
print('b < c :',b < c)
print('a < b :',a < b)
print('c < c :',c < c)
print('a <= c :',a <= c) # a が c の部分集合ならTrue a.issubset(c)
print('b <= c :',b <= c)
print('a <= b :',a <= b)
print('c <= c :',c <= c)
print('d == d :',d == d) # 完全一致でTrueを返す
print('d != d :',d != d)
print('c == d :',c == d)
print('c != d :',c != d) # 完全不一致でTrueを返す c.isdisjoint(d)
比較演算子と似ていますが、意味が異なるので注意しましょう。
また、<= と >= は等価な集合には True を返します。
集合要素の存在チェック
集合の要素が存在しているか確かめるには in を使います。
code: 0236_check_exists_in.py
print(data)
print(1 in data)
print(5 in data)
print(1 not in data)
print(5 not in data)