a

set

set: 集合演算ができる

値の重複不可能
mutableなオブジェクト
要素の順を持たない
in での存在チェックや、内包表記はリストと同じ
== での比較はリストと同じだが、順序は見ない


基本構文

初期化

a = {"bb", "cc", "aa"} 
print(a)
# {'cc', 'bb', 'aa'}

初期化 : set(値, 値,...)

s = set(range(5, 10))
print(s)
# (5, 6, 7, 8, 9)

リストの重複を削除

l = [1, 2, 3, 4, 5, 1, 2]
s = set(l) # setは重複を除外する
print(s)
# {1, 2, 3, 4, 5}
l = list(s)
print(l)
# [1, 2, 3, 4, 5]

要素の追加 : add(値) / 削除 : remove(値)

x = set() # 空のset作成
x.add("banana")
x.add("pine")
x.add("cherry")
print(x)
# {'cherry', 'pine', 'banana'} # 順不同 
x.remove("pine") # 要素がない場合、エラー
print(x)
# {'cherry', 'banana'}

削除 : discard(要素がなくてもエラーにならない)

a = {"aa", "bb", "cc"}
a.discard("dd")
print(a)
# {'aa', 'cc', 'bb'}
a.discard("bb")
print(a)
# {'aa', 'cc'}

setを空にする : clear()

a = {"aa", "bb", "cc"}
print(a)
# a = {'bb', 'aa', 'cc'}
a.clear()
print(a)
# set()

pop(値)

a = {"aa", "bb", "cc"}
x = a.pop()
print(a)
# {'aa', 'cc'}
print(x)
# bb # 取れる値はランダム

変更不可のfrozenset(値,値,...)

data = frozenset(["aa", "bb", "cc"])
print(data)
# frozenset({'aa', 'bb', 'cc'})
print(type(data))
# <class 'frozenset'>

リストからsetの内包表記 : {式 for 値 in イテラブル if 条件式}

numbers = [-1.3, 1.2, -1.2, 1.1, 1.5, -1.1, 1.2, 1.1, 1.4]
num_set = {num for num in numbers if num > 0} # リストから重複削除、整数のセット
print(num_set)
# {1.2, 1.4, 1.1, 1.5}

集合演算

演算子(|, &, -, ^)はset同士でないと使えないが、 union(), intersection(), difference(), symmentric_difference() はイテラブルであれば使える

和集合: union(): |

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = {"パイナップル", "スイカ"}
d = a | b | c
print(d)
# {'スイカ', 'パイナップル', 'リンゴ', 'みかん'}

e = ["いちご", "パイナップル"]  # リスト
f = ("バナナ", "みかん")  # タプル
mix = d.union(e, f)
print(mix)
# {'スイカ', 'パイナップル', 'リンゴ', 'バナナ', 'みかん', 'いちご'}

積集合: intersection(): &

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = {"パイナップル", "みかん", "スイカ"}
d = a & b & c
print(d)
# {'みかん'}

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = {"パイナップル", "みかん", "スイカ"}
d = a.intersection(b, c)
print(d)
# {'みかん'}

差集合: difference(): -

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = a - b
print(c)
# {'リンゴ'}

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = a.difference(b)
print(c)
# {'リンゴ'}

対称差集合: symmetric_difference(): ^

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = a ^ b
print(c)
# {'リンゴ', 'スイカ'}

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = a.symmetric_difference(b)
print(c)
# {'リンゴ', 'スイカ'}

代入複合演子

セット値を更新する為、frozensetには使えない

和集合で更新 : update(set,set,...) : |=

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = {"パイナップル", "スイカ"}
a.update(b, c)
print(a)
# {'みかん', 'パイナップル', 'スイカ', 'リンゴ'}

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = {"パイナップル", "スイカ"}
a |= b
a |= c
print(a)
# {'みかん', 'パイナップル', 'スイカ', 'リンゴ'}

積集合で更新: intersection_update(): &=

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = {"パイナップル", "みかん", "スイカ"}
a.intersection_update(b, c)
print(a)
# {'みかん'}

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
c = {"パイナップル", "みかん", "スイカ"}
a &= b
a &= c
print(a)
# {'みかん'}

差集合で更新: difference_update(): -=

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
a.difference_update(b)
print(a)
# {'リンゴ'}

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
a -= b
print(a)
# {'リンゴ'}

対称差集合で更新: symmetric_difference_update(): ^=

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
a.symmetric_difference_update(b)
print(a)
# {'リンゴ', 'スイカ'}

a = {"リンゴ", "みかん"}
b = {"みかん", "スイカ"}
a ^= b
print(a)
# {'リンゴ', 'スイカ'}

要素の比較

全ての要素の比較(順不同) : == / !=

a = {"aa", "bb", "cc"}
b = {"aa", "bb", "cc"}
c = {"aa", "bb", "dd"}
print(a == b)
# True
print(a != c)
# True

共通要素が1つもない : isdisjoint()

a = {"aa", "bb", "cc"}
b = {"x", "bb", "y"}
c = {"o", "p", "q"}
print(a.isdisjoint(b)) # "bb"が一致している
# False
print(a.isdisjoint(c)) # 1つも一致していない
# True

部分集合(サブセット) : issubset(set) : <=

同値でもTrueになる

a = {"red", "blue"}
b = {"blue", "green", "red", "pink"}
print(a.issubset(b))
# True
print(a <= b)
# True

上位集合(スーパーセット) : issuperset(set) : >=

a = {"blue", "green", "red", "pink"}
b = {"red", "blue"}
print(a.issuperset(b))
# True
print(a >= b)
# True