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)を、キー要素に指定できないからです。