variable long dict python python-2.7 hashmap frozenset

python - long - ¿Es seguro usar congelados como la tecla Dict?



python set (3)

Obviamente funciona, pero ¿hay casos en que dos conjuntos de los mismos elementos suceden para agregar dos entradas en Dict? Supongo que tengo esta condición antes y cambié mi código de frozenset(...) a tuple(sorted(frozenset(...))) . ¿Alguien sabe cómo la implementación de Dict y frozenset confirma si se requiere o no?


de los documentos oficiales

El tipo frozenset es inmutable y manejable: su contenido no se puede modificar una vez creado; por lo tanto, puede usarse como una clave de diccionario o como un elemento de otro conjunto.

(El énfasis es mío)


De acuerdo con los documentos, Frozenset es manejable porque es inmutable. Esto implicaría que puede usarse como la clave para un dict, porque el requisito previo para una clave es que sea hashable.

De los documentos de FrozenSet

El tipo frozenset es inmutable y manejable: su contenido no se puede modificar una vez creado; por lo tanto, puede usarse como una clave de diccionario o como un elemento de otro conjunto.

Y redundantemente, de los documentos del diccionario :

... teclas, que pueden ser de cualquier tipo inmutable

Para aclarar, un conjunto (por definición), congelado o no, no conserva el orden. Se almacenan internamente con orden no tomado en cuenta y con elementos duplicados eliminados, por lo que dos conjuntos construidos en diferentes órdenes serían claves equivalentes en un diccionario; son lo mismo.

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

y de la misma manera,

>>> 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''


¿Hay casos en que dos conjuntos de los mismos elementos suceden para agregar dos entradas en Dict?

El algoritmo hash frozenset no depende del orden de los elementos, solo en los elementos mismos. Dos FS''es con los mismos elementos son iguales y tienen hash iguales, satisfaciendo ambos criterios para "identidad dict", en otras palabras, son la misma clave dict:

>>> 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}