# 7 `sets` -- ユニークな要素の順序なしコレクション

バージョン 2.3 で 新たに追加 された仕様です。

`sets`モジュールは、ユニークな要素の順序なしコレクションを構築し、 操作するためのクラスを提供します。 帰属関係のテストやシーケンスから重複を取り除いたり、 積集合・和集合・差集合・対称差集合のような標準的な数学操作などを含みます。

他のコレクションのように、`x in set`, `len(set)`, `for x in set`をサポートします。 順序なしコレクションは、挿入の順序や要素位置を記録しません。 従って、インデックス・スライス・他のシーケンス的な振舞いをサポートしません。

ほとんどの集合のアプリケーションは、`__hash__()`を除いて すべての集合のメソッドを提供する`Set`クラスを使用します。 ハッシュを要求する高度なアプリケーションについては、 `ImmutableSet`クラスが`__hash__()`メソッドを加えているが、 集合の内容を変更するメソッドは省略されます。 `Set`と`ImmutableSet`は、 何が集合(`isinstance(obj, BaseSet)`)であるか決めるのに役立つ 抽象クラス`BaseSet`から派生します。

集合クラスは辞書を使用して実装されます。 このことから、集合の要素にするには辞書のキーと同様の要件を満たさなけれ ばなりません。具体的には、要素になるものには `__eq__` と `__hash__` が定義されているという条件です。 その結果、集合はリストや辞書のような変更可能な要素を含むことができません。 しかしそれらは、タプルや`ImmutableSet`のインスタンスのような 不変コレクションを含むことができます。 集合の集合の実装中の便宜については、内部集合が自動的に変更不可能な形式に 変換されます。 例えば、`Set([Set(['dog'])])`は`Set([ImmutableSet(['dog'])])`へ 変換されます。

クラス `Set`( | [iterable])

  新しい空の`Set`オブジェクトを構築します。 もしオプションiterableが与えられたら、イタレータから得られた 要素を備えた集合として更新します。 iterable中の全ての要素は、変更不可能であるか、 または5.7.3で記述されたプロトコルを使って 変更不可能なものに変換可能であるべきです。

クラス `ImmutableSet`( | [iterable])

  新しい空の`ImmutableSet`オブジェクトを構築します。 もしオプションiterableが与えられたら、イタレータから得られた 要素を備えた集合として更新します。 iterable中の全ての要素は、変更不可能であるか、 または5.7.3で記述されたプロトコルを使って 変更不可能なものに変換可能であるべきです。

  `ImmutableSet`オブジェクトは`__hash__()`メソッドを備えているので、 集合要素または辞書キーとして使用することができます。 `ImmutableSet`オブジェクトは要素を加えたり取り除いたりするメソッドを 持っていません。したがって、コンストラクタが呼ばれたとき要素はすべて 知られていなければなりません。