在我的 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) + ')'
还有两个列表,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))
我想计算 initialPointsList
和 burnedPointsList
之间的差异
我已经执行了:
result = set(initialPointsList) - set(burnedPointsList)
for item in result:
print item
并得到如下输出:
point: (1, 1)
point: (1, 4)
point: (1, 5)
point: (1, 6)
point: (1, 2)
point: (1, 3)
point: (1, 7)
但我期待另一个结果,没有燃烧点坐标:
point: (1, 1)
point: (1, 4)
point: (1, 5)
point: (1, 6)
point: (1, 7)
在 Python 中最好的方法是什么?我的代码有什么不正确的地方?
最佳答案
如果你想让它正常工作,你需要定义 __eq__()
和 __hash__()
特殊方法。如果您定义 __eq__()
,那么定义 __ne__()
通常也是一个好主意。 .
__eq__()
如果其参数相等(它们的 x 和 y 值相同),则应返回 True
。 __ne__()
应该做相反的事情。 __eq__()
通常也需要进行类型检查,如果“other”值与 self
的类型不同,则返回 false。
__hash__()
应该返回一个数字。对于与 __eq__()
比较相等的两个值,该数字应该相同,对于不同的值,它是不同的是可取的,但并不严格要求。一个好的实现是这样的:
def __hash__(self):
return hash((self.x, self.y))
元组散列算法将以统计上表现良好的方式组合其元素的散列值。有时您可能会看到人们在这里推荐按位异或(即 self.x ^ self.y
),但这不是一个好主意。该技术丢弃了它们共有的所有位,这导致散列性能较差(例如,如果 self.x == self.y
,它总是返回零)。
最后,您需要确保散列值在构建对象后不会改变。这最容易通过将 self.x
和 self.y
转换为只读 properties 来实现。 .
关于python - 在 Python 中设置减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949816/