Python基礎講座(6 セット)

## セット
セット(Set)は、ユニークなデータのグループを保持します。
つまり、同じデータを登録しても無視されます。
セットは{ }で括ります。またはset([ ])でも表現できます。

```py3:set_explain1.py
set_a = {1,2,"a","b",1,"a"}
set_b = set([1,2,"a","b",1,"a"])
print("set_a {0}".format(set_a))
print("set_b {0}".format(set_b))
```

出力されたセットに1と"a"は1つしか含まれません。
また、セットはデータの順番を持たないため、文字列やリストのようにインデックシングを行うことが出来ません。

以下のプログラムをコピーして、実行してください。それぞれの機能を説明します。

```set_explain.py
set_a = {7,9,2}
set_b = {9,22,2,25}

set_b_25 = 25 in set_b
set_b_0 = 0 in set_b
print("set_b_25 {0}".format(set_b_25))
print("set_b_0 {0}".format(set_b_0))

print("len(set_a) {0}".format(len(set_a)))

set_b.add(12)
set_b.remove(25)
set_b.discard(0)
set_c = {"a","b","c"}

set_union = set_a.union(set_b)
print("set_union {0}".format(set_union))

set_unions = set_a.union(set_b,set_c)
print("set_unions {0}".format(set_unions))

set_intersection = set_a.intersection(set_b,set_c)
print("set_intersection {0}".format(set_intersection))

set_difference = set_a.difference(set_b)
print("set_difference {0}".format(set_difference))

set_differences = set_a.difference(set_b,set_c)
print("set_differences {0}".format(set_differences))

set_difference_1 = set_a.difference(set_b)
set_difference_2 = set_b.difference(set_a)
print("set_difference_1 {0}".format(set_difference_1))
print("set_difference_2 {0}".format(set_difference_2))

set_symmetric_difference = set_a.symmetric_difference(set_b)
print("set_symmetric_difference {0}".format(set_symmetric_difference))

set_big = {"a","b","c"}
set_small = {"a","b"}
set_issuper = set_big.issuperset(set_small)
set_issub = set_small.issubset(set_big)
print("set_issuper {0}".format(set_issuper))
print("set_issub {0}".format(set_issub))
```

### セット内の要素の存在確認

リストと同様に、セットも**x in セット**でセット内に要素が存在するかを確認できます。

### len(セット)
リストと同様に要素の数を取得できます。
ただし、リストと異なり、max(),min()はセットには存在しません。
インデックシングが出来ないことから、範囲を指定しての差し替えも出来ません。

### データの追加
**セット.add(要素)**で追加可能です。先述したように、既に存在する要素を追加しても
セット内に同じ要素が2つ以上存在することはありません。

### データの削除
**セット.remove(要素)**で削除可能です。
ただし、remove()を使用すると、セット内に要素が存在しない場合はエラーが発生します。
事前に**x in セット**で確認しても良いですが、**セット.discard(要素)**という便利な命令があります。
これは「要素がセットに存在している時に限り削除する」という便利な機能です。

セットを使用するメリットは、ユニオン(合併)やインターセクション(積集合)、ディファレンス(差集合)の
処理が高速に行える点です。
*※ただし、これらの処理は2015年1月時点で、paiza.ioでは対応していません。*

### ユニオン(合併)
**セット1.union(セット2,セット3,…)**
複数のセットから重複要素を省いて1つのセットにする処理のことです。
3つ以上のセットを使用しても同様の処理が可能です。

### インターセクション(交差・積集合)
**セット1.intersection(セット2,セット3,…)**
指定したセット両方(全て)に重複している要素を抽出します。
ユニオン同様3つ以上の要素からでも同様の処理が可能です。

### ディファレンス(差集合)
**セット1.difference(セット2,セット3,…)**
一方に存在し、もう一方に存在しない要素を抽出します。
ユニオン同様3つ以上の要素からでも処理が可能です。

### シンメトリックディファレンス
通常のディファレンスでは、X.difference(Y)とY.difference(X)では
(両方が同一のセットでない限り）結果が異なります。
実行したプログラムを確認してください。

**set_a set([9, 2, 7])
 set_b set([2, 12, 22, 9])
 set_difference_1 set([7])
 set_difference_2 set([12, 22])**

それに対して、シンメトリックディファレンスを用いれば、順番に関係なく
XとY一方のセットに存在する項目を抽出できて便利です。
**セット1.symmetric_difference(セット2)**
シンメトリックディファレンスは2つのセットに対して限定の処理です。

### スーパーセット・サブセット
*※以降はpaiza.ioでも対応済みです。*
セットBの要素がセットAの要素に全て含まれる場合、
「セットAはセットBのスーパーセット」「セットBはセットAのサブセット」と言います。
**セットA.issuperset(セットB)**でセットAがセットBのスーパーセットかを、TrueかFalseかで返します。
**セットB.issubset(セットA)**でセットAがセットBのサブセットかを、TrueかFalseかで返します。

このように、セットは値の重複の判定や結合の処理を行う際に便利です。

次: [Python基礎講座(7 ディクショナリ)](http://qiita.com/Usek/items/1463b544ca2d0aeec4e2)