Si cela peut vous aider... si vous avez vraiment besoin de convertir des éléments non hachables en équivalents hachables pour une raison quelconque, vous pouvez faire quelque chose comme ceci :
from collections import Hashable, MutableSet, MutableSequence, MutableMapping
def make_hashdict(value):
"""
Inspired by https://stackoverflow.com/questions/1151658/python-hashable-dicts
- with the added bonus that it inherits from the dict type of value
so OrderedDict's maintain their order and other subclasses of dict() maintain their attributes
"""
map_type = type(value)
class HashableDict(map_type):
def __init__(self, *args, **kwargs):
super(HashableDict, self).__init__(*args, **kwargs)
def __hash__(self):
return hash(tuple(sorted(self.items())))
hashDict = HashableDict(value)
return hashDict
def make_hashable(value):
if not isinstance(value, Hashable):
if isinstance(value, MutableSet):
value = frozenset(value)
elif isinstance(value, MutableSequence):
value = tuple(value)
elif isinstance(value, MutableMapping):
value = make_hashdict(value)
return value
my_set = set()
my_set.add(make_hashable(['a', 'list']))
my_set.add(make_hashable({'a': 1, 'dict': 2}))
my_set.add(make_hashable({'a', 'new', 'set'}))
print my_set
Mon implémentation de HashableDict est l'exemple le plus simple et le moins rigoureux de aquí . Si vous avez besoin d'un HashableDict plus avancé qui supporte le décapage et d'autres choses, consultez les nombreuses autres implémentations. Dans ma version ci-dessus, je voulais conserver la classe dict originale, préservant ainsi l'ordre des OrderedDicts. J'utilise également AttrDict de aquí pour un accès de type attribut.
Mon exemple ci-dessus ne fait en aucun cas autorité, il s'agit simplement de ma solution à un problème similaire où j'avais besoin de stocker certaines choses dans un ensemble et où je devais d'abord les "hacher".
4 votes
Tout ce qui n'est pas immuable constitue généralement une mauvaise clé. Vous pouvez utiliser des tuples si vous le devez.