web-dev-qa-db-ja.com

凍結セットをディクトキーとして使用しても安全ですか?

それは明らかに機能しますが、同じ要素の2つのセットがたまたまDictに2つのエントリを追加する場合がありますか?以前にこの状態になり、コードをfrozenset(...)からTuple(sorted(frozenset(...)))に変更したと思います。 Dictとfrozensetの実装がそれが必要かどうかを確認する方法を知っている人はいますか?

9
balki

同じ要素の2つのセットがたまたまDictに2つのエントリを追加する場合がありますか?

いいえ。 frozensetハッシュアルゴリズム 要素の順序には依存せず、要素自体にのみ依存します。同じ要素を持つ2つのFSは等しく、ハッシュも等しいため、「辞書の同一性」の両方の基準を満たします。つまり、同じ辞書キーです。

>>> a = frozenset([1,1,1,1,2,3])
>>> b = frozenset([3,3,3,3,2,1])
>>> {a:1, b:2}
{frozenset([1, 2, 3]): 2}
10
georg

frozensetdictキーとして使用しても安全ですか? はい

ドキュメントによると、Frozensetは不変であるため、ハッシュ可能です。キーの前提条件はハッシュ可能であるため、これはdictのキーとして使用できることを意味します。

FrozenSet docs から

フリーズセットタイプは不変でハッシュ可能です—作成後にその内容を変更することはできません。したがって、辞書キーとして、または別のセットの要素として使用できます。

そして冗長に、 辞書ドキュメント から:

...キー。任意の不変タイプにすることができます


明確にするために、セット(定義による)は、凍結されているかどうかに関係なく、順序を保持しません。これらは、順序が考慮されず、重複する要素が削除された状態で内部的に保存されるため、異なる順序で作成された2つのセットは、辞書内の同等のキーになります。

>>> frozenset([1,2,2,3,3]) == frozenset([3,2,1,1,1])
True

同様に、

>>> d = {}
>>> d[frozenset([1,1,2,3])] = 'hello'
>>> d[frozenset([1,2,3,3])]
'hello'
>>> d[frozenset([3,3,3,2,1,1,1])]
'hello'
>>> d[frozenset([2,1,3])]
'hello'
20
John the King

から 公式ドキュメント

フリーズセットタイプは不変でハッシュ可能です—作成後にその内容を変更することはできません。 したがって、辞書キーまたは別のセットの要素として使用できます。

(強調は私のものです)

7
gboffi