一个人问了一个关于SO的问题,该问题是如何在Python中使用替代的相等函数来获取列表的唯一函数。
我在想可以通过从元素类继承并重载等于函数来完成
import functools
@functools.total_ordering
class ffloat(float):
def __eq__(self,other):
if floor(self) == floor(other):
return True
else:
return False
def __le__(self,other):
if self == other:
return True
else:
return float(self) <= float(other)
def __hash__(self):
return floor(self)
a = map(ffloat,[4.3,8,8.9, 13])
In [41]: a[1] == a[2]
Out[41]: True
但
In [42]: set(a)
Out[42]: set([4.3, 8.0, 8.9, 13.0])
编辑:用地板等值取代abs 添加哈希
附言有没有办法使一个类工厂由此而成为一个类和两个lambda并返回一个从第一个继承的类重写所需的相等函数的类。
最佳答案
这不是有效的相等函数,因为它不是transitive:mfloat(0) == mfloat(1) == mfloat(2)
,但mfloat(0) != mfloat(2)
。
还要注意,为了在集合中使用,必须覆盖__hash__
,以便对于类的所有实例a,b都具有以下属性:
a == b ⇒ hash(a) == hash(b)
set找出该
hash(mfloat(8)) != hash(mfloat(9))
。由于set假设上述属性成立,因此可以得出mfloat(8) != mfloat(9)
而不实际调用__eq__
的结论。总而言之,这有效:
from math import floor
class ffloat(float):
def __eq__(self,other):
return floor(self) == floor(other):
def __hash__(self):
return floor(self)
a = map(ffloat,[4.3,8,8.9, 13])
print(set(a))
# output: {8.0, 4.3, 13.0}
关于python - 我在做什么错(在python中通过重载实现替代相等),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7318398/