我有一个类有浮点数x(和y,从x生成,所以如果x是等价的,y也是等价的)。初始化后,实例不会更改。我想创建一组实例(使用.add()
),所以我试着让类可以使用:
class X:
def __init__(self,x,y):
self.x = x
self.y = y
def __hash__(self):
return hash(tuple(self.x))
def __eq__(self,other):
return (
self.__class__ == other.__class__ and
self.x == other.x
)
但是由于浮点不准确,该集合将识别两个非常接近的实例。我想将__eq__
设置为
def __eq__(self,other):
diff = np.max(np.asarray(self.x)-np.asarray(other.x))
if diff<1e-6:
return True
else:
return False
但这并不能解决浮点问题。
我可以使用元组(x,y)
来解决这个问题,但我不需要比较y
,而我正在处理的真正的类有点复杂。
答案 0 :(得分:1)
您可以使用标准库中math module的math.isclose
来比较浮点数,并且可能将用于生成哈希值的值舍入(或截断)为默认使用的小数位数按isclose
。 (最后一个值可以参数化)
class X:
def __init__(self,x,y):
self.x = x
self.y = y
def __hash__(self):
return hash(tuple(round(self.x, 9)) # round the value hashed to match the default of math.isclose
def __eq__(self,other):
return (
self.__class__ == other.__class__ and
math.isclose(self.x, other.x)
)