在我的Python代码中,我有这个类:
class _Point2D:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return 'point: (' + str(self.x) + ', ' + str(self.y) + ')'
Run Code Online (Sandbox Code Playgroud)
并且有两个列表,initialPointsList并且burnedPointsList:
initialPointsList = []
initialPointsList.append(_Point2D(1, 1))
initialPointsList.append(_Point2D(1, 2))
initialPointsList.append(_Point2D(1, 3))
initialPointsList.append(_Point2D(1, 4))
initialPointsList.append(_Point2D(1, 5))
initialPointsList.append(_Point2D(1, 6))
initialPointsList.append(_Point2D(1, 7))
burnedPointsList = []
burnedPointsList.append(_Point2D(1, 2))
burnedPointsList.append(_Point2D(1, 3))
Run Code Online (Sandbox Code Playgroud)
我想计算的差异之间initialPointsList和burnedPointsList
我执行了:
result = set(initialPointsList) - set(burnedPointsList)
for item in result:
print item
Run Code Online (Sandbox Code Playgroud)
并获得以下输出:
point: (1, 1)
point: (1, 4)
point: (1, 5)
point: (1, 6)
point: (1, 2)
point: (1, 3)
point: (1, 7)
Run Code Online (Sandbox Code Playgroud)
但我期待另一个结果,没有烧伤点坐标:
point: (1, 1)
point: (1, 4)
point: (1, 5)
point: (1, 6)
point: (1, 7)
Run Code Online (Sandbox Code Playgroud)
在Python中最好的方法是什么?我的代码有什么不对?
如果要使其正常工作,则需要定义__eq__()和__hash__()特殊方法.如果定义__eq__(),定义通常也是一个好主意__ne__().
__eq__()True如果它的参数是等价的(它们的x和y值相同),则应该返回. __ne__()应该做相反的事情.通常也需要进行__eq__()类型检查,如果"其他"值的类型不同,则返回false self.
__hash__()应该返回一个数字.对于两个比较相等的值,该数字应该是相同的__eq__(),并且它是可取的但不是严格要求它对于不同的值是不同的.一个很好的实现是这样的:
def __hash__(self):
return hash((self.x, self.y))
Run Code Online (Sandbox Code Playgroud)
元组散列算法将以统计上良好的方式组合其元素的散列值.您有时可能会self.x ^ self.y在这里看到人们推荐按位XOR(即),但这不是一个好主意.该技术抛弃了它们共有的所有位,这使得散列性能较差(例如,如果它总是返回零self.x == self.y).
最后,您需要确保在构造对象后哈希值不会更改.这是最容易被转换完成self.x,并self.y为只读属性.
| 归档时间: |
|
| 查看次数: |
1125 次 |
| 最近记录: |