概要
set型はlist型よりも演算が早いので使う場面が多いが、集合には少し注意が必要と感じたので備忘録として残す。
setの基本的な使い方は下記リンクを参照のこと。
- 実施期間: 2022年5月
- 環境:Colab (Python3)
集合
使用する集合は下記とする。
set0 = {i for i in range(11)}
set1 = {1, 2, 3, 6, 7}
set2 = {3, 4, 5, 7, 8}
set3 = {6, 7, 8, 9, 10}
和集合
|演算子かunion()で求める。
set1,2と、set1,2,3の和集合は下記となる。
print(set1 | set2) # または
print(set1.union(set2))
>>> {1, 2, 3, 4, 5, 6, 7, 8}
print(set1 | set2 | set3) # または
print(set1.union(set2,set3))
>>> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
積集合
&演算子かintersection()で求める。
set1,2と、set1,2,3の積集合は下記となる。
print(set1 & set2) # または
print(set1.intersection(set2))
>>> {3, 7}
print(set1 & set2 & set3) # または
print(set1.intersection(set2,set3))
>>> {7}
差集合
-演算子かdifference()で求める。差なので順番により答えは異なる。
set1,2と、set2,1の差集合は下記となる。
print(set1 - set2) # または
print(set1.difference(set2))
>>> {1, 2, 6}
print(set2 - set1) # または
print(set2.difference(set1))
>>> {8, 4, 5}
set1,2と、set2,1の差集合をベン図で太字で書くとこんな感じ
対称差集合
^演算子かsymmetric_difference()で求める。
まず、^演算子を使ったset1,2の対称差集合は下記となる。
print(set1 ^ set2)
>>> {1, 2, 4, 5, 6, 8}
重なっていた{3, 7}が除かれた結果となる。
では、set1^set2^set3はどうなるのか?3集合間で重なった{3, 6, 7, 8}が除かれるわけではない。
print(set1 ^ set2 ^ set3)
>>> {1, 2, 4, 5, 7, 9, 10}
先に求めたset1^set2の対称差集合{1, 2, 4, 5, 6, 8}に対し、再度set3で対称差集合を求めたものになった。
こんな計算に意味があるのか疑問なので、対称差集合には2変数だけを使用すべきだと思う。
Pythonにそういった思いがあるのか下記はエラーとなる。symmetric_difference()だけには2変数以上は渡せない。
print(set1.symmetric_difference(set2, set3))
>>> TypeError: symmetric_difference() takes exactly one argument (2 given)
以上