在這種情況下幫助......如果你真的需要unhashable東西轉換成哈希的等效由於某種原因,你可能會做這樣的事情:
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
我HashableDict實現是最簡單和最嚴格的例如從here。如果您需要更高級的支持酸洗和其他功能的HashableDict,請檢查其他許多實現。在我上面的版本中,我想保留原始的dict類,從而保留OrderedDicts的順序。我還使用here的AttrDict進行屬性類訪問。
我上面的示例沒有任何權威性,只是我解決類似問題的方法,我需要將一些內容存儲在一個集合中,並需要首先對它們進行「哈希」。
任何不可改變的東西通常都會導致錯誤的關鍵。如果必須的話,你可以使用元組。 – 2011-06-10 18:59:29