pythonの集合型 set
pythonの集合型setの使い方について。
・重複のない配列。
・順序がないのでs[1]のようなインデックス指定ができない。
・inメソッドによる検索が高速
○生成
# coding: utf-8 s1 = set() # 空のset print(s1) # set() print(type(s1)) # <class 'set'> s2 = {1, 1, 2, 2, 3, 4} print(s2) # {1, 2, 3, 4} print(len(s2)) # 4 要素数 s3 = {} print(type(s3)) # <class 'dict'> list1 = [1, 3, 5, 7] s4 = set(list1) print(s4) # {1, 3, 5, 7} t = (2, 4, 6, 8) s5 = set(t) print(s5) # {8, 2, 4, 6} 順序は保証されない d = {"a":1, "b":5} s6 = set(d) print(s6) # {'a', 'b'} キーのみの集合 s7 = set("akasaka") # 文字列からsetを生成 print(s7) # {'s', 'a', 'k'} s1 = {1, 3, 5} s8 = s1.copy() print(s8) # {1, 3, 5}
○追加
s1 = {1, 3, 5}
s1.add(7) # 要素7を追加
print(s1) # {1, 3, 5, 7}
s1.add(1) # すでに存在する要素を追加しても変更なし
print(s1) # {1, 3, 5, 7}
s1 = {1, 3, 5}
list1 =[10, 20, 30]
s1.update(list1) # listを追加
print(s1) # {1, 3, 5, 10, 20, 30}
s1 = {1, 2, 3}
#s1.update(7, 8, 9) # TypeError: 'int' object is not iterable
s1.update((7, 8, 9)) # タプルの追加は括弧が必要
print(s1) # {1, 2, 3, 7, 8, 9}
s1 = {1, 2, 3}
s2 = {4, 5, 6}
d ={7:7, 8:8}
s1.update(s2, d) # 複数のタプル、リスト、辞書、集合の追加ができる
print(s1) # {1, 2, 3, 4, 5, 6, 7, 8}
○削除
s1 = {1, 3, 5}
s1.remove(5) # 要素5を削除
print(s1) # {1, 3}
#s1.remove(4) # KeyError: 4 存在しない要素はエラー
s1.discard(4) # 存在しなくてもエラーなし
s1.discard(3) # 要素3を削除
print(s1) # (1)
s1 = {1, 3, 5}
s1.pop() # ランダムで削除
print(s1) # {3, 5}
s1 = {1, 3, 5}
p = s1.pop() # ランダムで削除し、その要素をpに代入
print(p) # 1
s1 = {1, 2, 3, 4, 5}
s2 = {0, 1, 2, 3}
s3 = s1 - s2 # s1の要素からs2の要素を引く
print(s3) # {4, 5}
s1 = {1, 2, 3, 4, 5}
s2 = {0, 1, 2, 3}
s3 = s1.difference(s2) # s1 - s2と同義だが、set型以外でも。
print(s3) # {4, 5}
#s4 = s1 + s2 # TypeError: unsupported operand type(s) for +: 'set' and 'set'
○全削除
s1 = {1, 3, 5}
s1.clear() # 要素を全削除
print(s1) # set()
del s1 # 変数s1を削除
#print(s1) # NameError: name 's1' is not defined
○和集合
s1 = {1, 3, 5}
s2 = {1, 2, 3}
s3 = s1 | s2 # 和集合
print(s3) # {1, ,2 ,3, 5}
s1 = {1, 3, 5}
s2 = {1, 2, 3}
s3 = s1.union(s2) # s1 | s2 と同義で、set以外でも。
print(s3) # {1, ,2 ,3, 5}
○積集合
s1 = {1, 3, 5}
s2 = {1, 2, 3}
s3 = s1 & s2 #共通部分(積集合)
print(s3) # {1, 3}
s1 = {1, 3, 5}
s2 = {1, 2, 3}
s3 = s1.intersection(s2) # s1 & s2 と同義で、set以外でも。
print(s3) # {1, 3}
○一方のみ
s1 = {1, 3, 5}
s2 = {1, 2, 3}
s3 = s1 ^ s2 # elements in s1 or s2 but not both
print(s3) # {2, 5}
s1 = {1, 3, 5}
s2 = {1, 2, 3}
s3 = s1.symmetric_difference(s2) # s1 ^ s2 と同義で、set以外でも。
print(s3) # {2, 5}
○累積演算ができる
s1 |= s2
s1 &= s2
s1 -= s2
s1 |= s2
s1 = {1, 3, 5}
s2 = {1, 2, 3}
s1 &= s2
print(s1) # {1, 3}
○検索
in 含まれていたらTrue
not in 含まれていなかったらTrue
s1 = {1, 3, 5}
print(1 in s1) # True
print(2 in s1) # False
print(3 not in s1) # False
print(4 not in s1) # True
○部分集合
s1 = {1, 3, 5}
s2 = {1, 3}
s3 = {1, 2}
print(s1 >= s2) # True
print(s1 >= s1) # True
print(s1 > s1) # False
print(s1 <= s2) # False
print(s3 <= s1) # False
print(s1.issubset(s2)) # print(s1 <= s2) と同義
print(s1.issuperset(s2)) # print(s1 >= s2) と同義
○set内包表記
a = {x for x in 'abracadabra' if x not in 'abc'}
print(a) # {'r', 'd'}
すべての部分集合の列挙
集合型で作る方法がわからなかったので、itertoolsで。
# 全ての部分集合の列挙 from itertools import combinations items = [1, 2, 3, 4] subsets=[] for i in range(len(items) + 1): for c in combinations(items, i): subsets.append(c) print(subsets) # [(), (1,), (2,), (3,), (4,), (1, 2), ..., (2, 3, 4), (1, 2, 3, 4)] print(len(subsets)) # 16
・frozensetについてはまたそのうち
参考:
pythonドキュメント データ構造