Pythonにとって”集合”という概念はあとから追加されたものです。
sample_set = {1, 2, 3, 4, 5}のように書き、辞書と非常に似ていますが、辞書と違いキーがありません。
辞書に値だけがある集まりというイメージです。{}を使う点は共通してますね。
集合は、順序やキーなどの構造を持たず、単純に集団を形成してるといいましょうか。
リストのようにオフセットで管理する必要もなく、辞書のキーで管理する必要もない要素たちを扱いたい時に使います。
set()で集合を作成
注意としては、empty_set = {}のように書いてしまうと空の辞書ができてしまいます。
空の集合をつくる際にはset()を使いましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
>>> empty_set = set() >>> empty_set set() >>> type(empty_set) <class 'set'> >>> empty_dict = {} >>> empty_dict {} >>> type(empty_dict) <class 'dict'> >>> sample_set = {1, 2, 3} >>> sample_set {1, 2, 3} >>> type(sample_set) <class 'set'> |
set()で他のデータ型を集合へ
文字列、リスト、タプル、辞書を集合へ変換できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> set('abcdefg') {'a', 'f', 'e', 'g', 'b', 'c', 'd'} >>> set('good') #"o"という文字は2つある。重複は取り除かれる {'o', 'd', 'g'} >>> set(['good', 'better', 'good', 'best']) #リストを集合へ {'best', 'better', 'good'} >>> set(('good', 'better', 'good', 'best')) #タプルを集合へ {'best', 'better', 'good'} >>> set({'banana': 'yellow', 'banana': 'delicious', 'orange': 'Ehime'}) #辞書を集合へ {'orange', 'banana'} |
ある値が集合に含まれているかどうか
1 2 3 4 5 |
>>> numbers = {'1', '2', '3'} >>> '2' in numbers True >>> '4' in numbers False |
集合の組み合わせ、演算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
>>> a = set('abracadabra') >>> b = set('alacazam') >>> a {'d', 'c', 'r', 'a', 'b'} >>> b {'m', 'z', 'l', 'c', 'a'} >>> a | b #和集合。aまたはbに含まれているもの {'m', 'z', 'd', 'c', 'l', 'r', 'a', 'b'} >>> a.union(b) #a|bと同じ意味 {'m', 'z', 'd', 'c', 'l', 'r', 'a', 'b'} >>> a - b #差集合。aには含まれているがbにはないもの {'d', 'r', 'b'} >>> a.difference(b) #a-bと同じ意味 {'d', 'r', 'b'} >>> a & b #aかつb。aにもbにも含まれているもの {'c', 'a'} >>> a ^ b #どちらか片方には含まれているが、両方には含まれていないもの {'m', 'r', 'z', 'd', 'l', 'b'} >>> a.symmetric_difference(b) #a ^ bと同じ意味 {'m', 'r', 'z', 'd', 'l', 'b'} |
部分集合(逆は上位集合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
>>> a = {1, 2, 3, 4, 5} >>> b = {1, 2, 3} >>> b <= a #bはaの部分集合 True >>> b.issubset(a) True >>> a >= b #aはbの上位集合 True >>> a.issuperset(b) #a>=bと同じ意味 True >>> a < b #aはbの真部分集合ではない False >>> b < a #bはaの真部分集合である True >>> a < a #自分自身の真部分集合にはなれない False >>> a >= a #すべての集合は、自分自身の上位集合である True >>> a.issuperset(a) #a>=aと同じ意味 True |