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