6

I'm trying to create a custom hashing function for strings. I want to hash strings by their character frequency by weight. So that hi and ih will yield the same hash. Can I override __hash__?

Or is creating a wrapper class that holds the string and overriding __hash__ and __eq__ the only way?

4

3 に答える 3

4

等価セマンティクスが異なる派生型が必要です。通常、等式がどのように機能するかを定義し、そこから派生した構造からハッシュ メソッドを構築するというアプローチが取られます。それは次のようになります。

import collections

class FrequencyString(str):
    @property
    def normalized(self):
        try:
            return self._normalized
        except AttributeError:
            self._normalized = normalized = ''.join(sorted(collections.Counter(self).elements()))
            return normalized

    def __eq__(self, other):
        return self.normalized == other.normalized

    def __hash__(self):
        return hash(self.normalized)
于 2012-11-21T23:34:32.713 に答える
0

から継承できますstrが、これらは不変であるため、わずかに異なる方法でサブクラス化する必要があります。ほとんどの場合、既存の文字列から新しい文字列を作成する必要があるため、__new__メソッドもオーバーライドする必要があります。Python が行う最適化を無効にするために、特別なメソッドを追加する必要がある場合もあります。

これは、フォーム内のプレースホルダーを簡単に置換できるmapstrstrオブジェクトであるbuilt-in をサブクラス化する例です。

于 2012-11-21T23:20:04.253 に答える
0

あなたの仮定は正しいです。Python で基本クラスをオーバーライドすることはできません。もちろん、何をするかをオーバーライドすることはできますstr()が、文字列リテラルでは機能しません。

Python 2.2 より前のコードUserStringを作成している場合、独自のクラスを作成する場合は、次のクラスを参照してください: http://docs.python.org/2/library/userdict.html#module-UserString

それ以外の場合は、単に継承するstrか、unicode

__hash__あなたの場合、メソッドを辞書キーとして使用したい場合は、単にメソッドを上書きするだけで十分です。ただし、比較を検討している場合は、上書き__eq__または上書きする必要があります__cmp__

于 2012-11-21T22:43:11.830 に答える