web-dev-qa-db-fra.com

Une solution de contournement pour le type de dictée figée manquant de Python?

En Python, lorsque vous souhaitez utiliser des listes comme clés de certains dictionnaires, vous pouvez les transformer en tuples, qui sont immuables et donc sont hachables.

>>> a = {}
>>> a[Tuple(list_1)] = some_value
>>> a[Tuple(list_2)] = some_other_value

La même chose se produit lorsque vous souhaitez utiliser des objets set comme clés d'un dictionnaire - vous pouvez créer un frozenset, qui est à nouveau immuable et donc lavable.

>>> a = {}
>>> a[frozenset(set_1)] = some_value
>>> a[frozenset(set_2)] = some_other_value

Mais il semble que pour le dictionnaire il n'y ait pas d'équivalent.

Une première idée à laquelle j'ai pensé (et que j'ai trouvé finalement mauvais), est d'utiliser str(some_dict) comme clé. Mais, les dictionnaires utilisent toujours des fonctions de hachage différentes, donc les chaînes de dictionnaires égaux peuvent être différentes.

Existe-t-il une solution de contournement connue comme une bonne pratique, ou quelqu'un a-t-il d'autres idées sur la façon d'utiliser des objets de type dictionnaire comme clés d'autres dictionnaires?

11
SomethingSomething

J'ai trouvé une solution de contournement intéressante pour ce problème, qui construit un frozenset contenant les éléments du dictionnaire:

>>> a = {'key1' : 'val1', 'key2' : 'val2'}
>>> b = frozenset(a.items())
>>> frozenset_restored_to_dict = dict(b)
>>> frozenset_restored_to_dict
{'key2': 'val2', 'key1': 'val1'}

Comme on peut le voir dans le code, b est un frozenset, qui est immuable et hachable, et peut être totalement restauré pour être un dictionnaire régulier comme a.

19
SomethingSomething

Vous pouvez essayer dict dicté ou regarder ces réponses:

et il y a même un paquet sur PyPI: https://pypi.python.org/pypi/frozendict

Vous pouvez également simplement convertir dict en tuples (sorted(your_dict.items())) puis l'utiliser comme hachage.

UPD: comme mentionné dans les commentaires, OrderedDict n'est pas partageable. Mon mauvais, il ne doit vraiment pas être lavable car il est mutable.

4
Andrey Rusanov