3 回答
TA贡献1772条经验 获得超8个赞
这是制作可哈希字典的简单方法。请记住,出于明显的原因,不要在将它们嵌入另一本词典后对它们进行变异。
class hashabledict(dict):
def __hash__(self):
return hash(tuple(sorted(self.items())))
TA贡献1788条经验 获得超4个赞
散列应该是不可变的-不强制执行此操作,但可信任您不要在将dict作为键首次使用后对其进行突变,可以使用以下方法:
class hashabledict(dict):
def __key(self):
return tuple((k,self[k]) for k in sorted(self))
def __hash__(self):
return hash(self.__key())
def __eq__(self, other):
return self.__key() == other.__key()
如果您确实需要更改您的命令并且仍然想将它们用作键,那么复杂性会爆炸数百倍-并不是说无法完成,但是我将等到非常明确的指示后再进入那令人难以置信的烂摊子! -)
TA贡献1895条经验 获得超3个赞
使字典可用于您的目的所需要做的就是添加__hash__方法:
class Hashabledict(dict):
def __hash__(self):
return hash(frozenset(self))
请注意,frozenset转换将适用于所有词典(即,不需要键是可排序的)。同样,对字典值也没有限制。
如果有许多字典具有相同的键但具有不同的值,则必须让散列将这些值考虑在内。最快的方法是:
class Hashabledict(dict):
def __hash__(self):
return hash((frozenset(self), frozenset(self.itervalues())))
这比frozenset(self.iteritems())两个原因要快。首先,该frozenset(self)步骤重用了存储在字典中的哈希值,将不必要的调用保存到中hash(key)。其次,使用itervalues将直接访问这些值,并避免每次进行查找时都使用by 项在内存中形成新的许多键/值元组的许多内存分配器调用。
添加回答
举报