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 項在內存中形成新的許多鍵/值元組的許多內存分配器調用。
添加回答
舉報