ソースコードの歩き方《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)を、キー要素に指定できないからです。
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])
引数にリストを指定すると、各要素(整数)が集合の要素になります。括弧 [] の中には、もとのリストと同じ要素が列挙されます。