我在空间中有一些点,每个点都有一个id
. 我在另一组中也有这些点的一个子集,它们具有不同的id
值。
如何id
为两组点创建一种新类型,以便具有相同坐标的点最终使用相同的id
值?
我假设我需要使用它们的坐标生成哈希码,这应该id
为具有相同坐标的点提供相同的值,对吧?
我很困惑如何使用它,因为哈希码集比 float[3] 小得多。所以不确定我是否走在正确的轨道上。
我不完全确定你在这里的意思,但你可以使用__hash__
a 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 个对象,它们可能会更容易记忆。
哈希码并不意味着对于不相等的对象是唯一的——通常会有一些冲突。它们绝对不能用于测试是否相等。
哈希码用于将对象(希望)均匀地放置在数据结构中。如果要测试是否相等,请测试坐标是否相等。