##
5.12.1 Set オブジェクト

`Set`と`ImmutableSet`のインスタンスはともに、 以下の操作を備えています:

演算 | 等価な演算 | 結果
--- | --- | ---
`len(s)` |  | 集合sの濃度 (cardinality)

`x in s` |  | xがsに帰属しているかテストする
`x not in s` |  | xがsに帰属して否ないかテストする
`s.issubset(t)` | `s <= t` | sのすべての要素がtにあるかテストする
`s.issuperset(t)` | `s >= t` | tのすべての要素がsにあるかテストする

`s.union(t)` | s | t | sとtの両方の要素からなる新しい集合
`s.intersection(t)` | s & t | sとtで共通する要素からなる新しい集合
`s.difference(t)` | s - t | sにあるがtにない要素からなる新しい集合
`s.symmetric_difference(t)` | s ^ t | sとtのどちらか一方に属する要素からなる集合
`s.copy()` |  | sの浅いコピーからなる集合

演算子を使わない書き方である `union()`、 `intersection()`、 `difference()`、および`symmetric_difference()` は任意の イテレート可能オブジェクトを引数として受け取るのに対し、演算子を使った 書き方の方では引数は集合型でなければならないので注意してください。 これはエラーの元となる`Set('abc') & 'cbs'` のような書き方を 排除し、より可読性のある`Set('abc').intersection('cbs')` を選ばせるための仕様です。 バージョン2.3.1 以降で変更された 仕様: 以前は全ての引数が集合型でなければなりませんでした。

加えて、`Set`と`ImmutableSet` は集合間の比較をサポートしています。 二つの集合は、各々の集合のすべての要素が他方に含まれて (各々が他方の 部分集合) いる場合、かつその場合に限り等価になります。 ある集合は、他方の集合の真の部分集合 (proper subset、部分集合で あるが非等価) である場合、かつその場合に限り、他方の集合より小さくなります。 ある集合は、他方の集合の真の上位集合 (proper superset、上位集合で あるが非等価) である場合、かつその場合に限り、他方の集合より大きくなります。

部分集合比較やと等値比較では、完全な順序決定関数を一般化できません。 たとえば、互いに素な 2 つの集合は等しくありませんし、互いの部 分集合でもないので、`a<b`、 `a==b`、 `a>b` はすべて `False` を返します。 したがって集合は `__cmp__` メソッドを実装しません。

集合は一部の順序（部分集合の関係）を定義するだけなので、集合のリストにおいて `list.sort()` メソッドの出力は未定義です。

以下は`ImmutableSet`で利用可能であるが`Set`にはない操作です:

演算 | 結果
--- | ---
`hash(s)` | s のハッシュ値を返す

以下は`Set`で利用可能であるが`ImmutableSet`にはない操作です:

演算 | 等価な演算 | 結果
--- | --- | ---

`s.union_update(t)` | s |= t | tを加えた要素からなる集合sを返します
`s.intersection_update(t)` | s &= t | tでも見つかった要素だけを持つ集合sを返します
`s.difference_update(t)` | s -= t | tにあった要素を取り除いた後の集合sを返します
`s.symmetric_difference_update(t)` | s ^= t | sとtのどちらか一方に属する要素からなる集合 sを返します

`s.add(x)` |  | 要素xを集合sに加えます
`s.remove(x)` |  | 要素xを集合sから取り除きます; x がなければ KeyError を送出します
`s.discard(x)` |  | 要素xが存在すれば、集合sから取り除きます
`s.pop()` |  | sから要素を取り除き、それを返します; 集合が空なら KeyError を送出します
`s.clear()` |  | 集合sからすべての要素を取り除きます

演算子を使わない書き方である `union_update()`、 `intersection_update()`、`difference_update()`、 および`symmetric_difference_update()` は任意の イテレート可能オブジェクトを引数として受け取るので注意してください。 バージョン2.3.1 以降で変更された 仕様: 以前は全ての引数が集合型でなければなりませんでした。