Rom*_*her 1 python equality wrapper
一个人问了一个关于如何使用替代的相等函数在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
Run Code Online (Sandbox Code Playgroud)
但
In [42]: set(a)
Out[42]: set([4.3, 8.0, 8.9, 13.0])
Run Code Online (Sandbox Code Playgroud)
编辑:用平面相等替换abs <1.5相等
添加Hash PS有一种方法可以使一个类和两个lambda创建一个类工厂,并返回一个继承第一个类的类,覆盖所需的相等函数.
这不是一个有效的相等函数,因为它不是传递函数:
mfloat(0) == mfloat(1) == mfloat(2)但是mfloat(0) != mfloat(2).
另请注意,要在集合中使用,必须覆盖__hash__以便以下属性适用于您的类的所有实例a,b:
a == b ? hash(a) == hash(b)
Run Code Online (Sandbox Code Playgroud)
设置发现了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}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |