0

空間にいくつかのポイントがあり、各ポイントにはid. また、これらのポイントのサブセットが別のグループにあり、値が異なりidます。

同じ座標を持つポイントが同じ値idを使用するように、ポイントの両方のグループに対して新しいタイプの を作成するにはどうすればよいですか?id

id同じ座標を持つポイントに対して同じ値を与えるはずの座標を使用してハッシュコードを生成する必要があると思いますよね?

ハッシュコードのセットが float[3] よりもはるかに小さいため、どのように使用できるか混乱しています。だから、私が正しい軌道に乗っているかどうかはわかりません。

4

2 に答える 2

1

ここで何を意味するのか完全にはわかりませんが、次のように使用できます。__hash__tuple

class Point(object):
    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z

    def __hash__(self):
        return hash((self.x,self.y,self.z))

    def __eq__(self,other):
        return (self.x,self.y,self.z) == (other.x,other.y,other.z)

現在、同じポイントを含むオブジェクトはすべて同じ値にハッシュされます。副次的な利点として、辞書のキーとして、またはセット オブジェクトでもう少し合理的に使用できるようになりました。


もちろん、これほど単純なクラスを作成する場合は、collections.namedtuple代わりに を検討することをお勧めします。それをサブクラス化することもできます (すべてリンクで詳しく説明されています)。これには、オブジェクトが不変であるという利点があります-ハッシュ可能なオブジェクトを変更することは、良いことではありません;-)。また、オブジェクトには__dict__関連付けられていないため、100M のオブジェクトを作成する場合は、記憶が少し楽になるでしょう。

于 2013-02-11T00:31:46.987 に答える
0

ハッシュ コードは、等しくないオブジェクトに対して一意であることを意図していません。通常、いくつかの衝突が発生します。それらは、等しいかどうかをテストするために使用することはできません。

ハッシュ コードは、オブジェクトを (できれば) データ構造全体に均等に配置するために使用されます。等しいかどうかをテストする場合は、座標が等しいかどうかをテストします。

于 2013-02-11T00:39:32.127 に答える