0

collections.Counter を使用しています。同じクラスのオブジェクトを同じものとしてカウントしたいことを除けば、これまでのところ素晴らしいです。これどうやってするの?すべてのインスタンスが同じようにハッシュされるように、クラスのhash () メソッドをオーバーライドしようとしました。今、私がそうCounter([Type1(), Type1(), Type2(), Type2()])すると、代わりに{<Type1 object at...>:1,<Type1 object at...>:1,<Type2 object at...>:1,<Type2 object at...>:1}何かを返すことをお勧めし{"Type1":2, "Type2":2}ます。これは可能ですか?私はドキュメントをいじっていましたが、それを機能させる方法がわかりませんでした。

私が使用しているクラスは、本質的に定数値のラッパーであることを付け加えておきます。それらをクラスにラップする方が便利です。どのような状況でも、ある Type1 オブジェクトが別の Type1 オブジェクトと異なることはありません。

4

3 に答える 3

1

あなたの質問をもう一度読んだ後、あなたのニーズにより適した別のアプローチを追加しています。

Counter は辞書であり、Python の辞書は__hash__メソッドと__eq__メソッドを使用してオブジェクトを比較します。したがって、常に比較が等しく、辞書のキーとして使用できるオブジェクトが必要な場合は、これら 2 つのメソッドを定義する必要があります。

# (Python 3)
class Type1:
    def __eq__(self, other):
        if isinstance(other, Type1):
            return True
        return super().__eq__(other)

    def __hash__(self):
        return 1329916036    # anything constant

に対して同じことを行うと、次のようType2にインスタンスをカウントできます。Counter

>>> mycounter = Counter([Type1(), Type1(), Type2(), Type2()])
>>> mycounter
Counter({<__main__.Type1 object at ...>: 2, <__main__.Type2 object at ...>: 2})
>>> mycounter[Type1()]
2
于 2013-09-09T23:31:06.513 に答える