一个人问了一个关于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/

10-11 21:24