ソースコードの歩き方《IronPython》Set.__str__ 1/3

Previous|1/3|Next
Python.use(better, src=”IronPython”) # ソースコードを散策する記事一覧
メソッド Set.__str__IronPython

《著》本間りす《監修》小泉ひよ子とタマゴ倶楽部


set 型とともに、関係の深い frozenset 型についても解説します。

set 型のリテラル表現

set 型は、集合に相当します。集合は、順序を持たず重複しない要素群を表現したものです。set 型は、list/dict のような(文字どおりの)リテラル表現を持ちません。そこで、set 型のヘルプ情報を確認します。

>>> help(set)
Help on class set in module __builtin__:

class set(object)
| set(iterable) --> set object
|
| Build an unordered collection of unique elements.
...

これを見て、インスタンスを生成するには(コンストラクターに代わる)関数呼び出し set() を利用できることが分かります。

set 型のインスタンス:ハッシュ値

《関連記事》VDM++, 集合を要素とする集合 - 続・ひよ子のきもち


「集合を要素に持つ」集合も表現できます。ただし、集合の要素はハッシュ値を持つ(hashable)必要があります。

>>> set([set(e) for e in "ABC"])

Traceback (most recent call last):
File "", line 1, in
set([set(e) for e in "ABC"])
TypeError: set objects are unhashable

set 型のインスタンスは、ハッシュ値を持ちません。そのため、例外 TypeError を生成して、エラーメッセージを出力します。

>>> set([frozenset(e) for e in "ABC"])
set([frozenset(['C']), frozenset(['B']), frozenset(['A'])])

そこで、set 型の代わりに、frozenset 型のインスタンスを指定します。すると、3つの「集合」を要素とする集合が得られます。

>>> set([list(e) for e in "ABC"])

Traceback (most recent call last):
File "", line 1, in
set([list(e) for e in "ABC"])
TypeError: list objects are unhashable

同じ理由から(ハッシュ値を持たない)list 型のインスタンスを、集合の要素にはできません。

>>> set([tuple(e) for e in "ABC"])
set([('C',), ('A',), ('B',)])

同じ理由から(ハッシュ値を持つ)tuple 型のインスタンスなら、集合の要素にできます。

>>> set({'A': 0, 'C': 2, 'B': 1})
set(['A', 'C', 'B'])
>>> set(dict([(e,i) for i,e in enumerate("ABC")]))
set(['A', 'C', 'B'])

dict 型のインスタンスを指定すると、そのキー要素だけを含む集合が得られます。なぜなら、ハッシュ値を持たないもの(unhashable)を、キー要素に指定できないからです。


Previous|1/3|Next

set 型のインスタンス:同じ型の要素

IronPythonソースコードを理解するための布石として、実際に、その動作を確認してみましょう。

>>> set()
set([])

型名 set に演算子 () を適用する(関数呼び出し)と、set 型のインスタンスが得られます。引数を省略すると、要素を持たない「空集合」が得られます。set 型では、list 型と同じリテラル表現を使って、括弧 [] の中に要素を列挙します。

>>> set("A")
set(['A'])

引数に文字列を指定すると、各要素(長さ1の文字列)が集合の要素になります。ここでは、1つの文字列を列挙した、set 型のインスタンスが得られます。

>>> set("ABC")
set(['A', 'C', 'B'])

同様に、3つの文字列を列挙した、set 型のインスタンスが得られます。括弧 [] の中には、カンマ「,」で区切られた、集合の要素が列挙されます。入力した順序とは無関係に、出力される順序が決まるのが分かります。

>>> set("CBA")
set(['A', 'C', 'B'])

要素を記述する順序には、意味がありません(順不同)。ここでは、入力した順序が異なるにも関わらず(前述したものと)同じ順序で出力されるのが分かります。

>>> set("ABBCCC")
set(['A', 'C', 'B'])

同様に、3つの文字列を列挙した、set 型のインスタンスが得られます。重複する要素を与えても、それらは無視されます。

>>> set(range(3))
set([0, 1, 2])

引数にリストを指定すると、各要素(整数)が集合の要素になります。括弧 [] の中には、もとのリストと同じ要素が列挙されます。