python - 在 Python 中设置减法

标签 python python-2.7

在我的 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) + ')' 

还有两个列表,initialPointsListburnedPointsList:

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))

我想计算 initialPointsListburnedPointsList 之间的差异

我已经执行了:

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.xself.y 转换为只读 properties 来实现。 .

关于python - 在 Python 中设置减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949816/

相关文章:

python - 属性错误 : 'SimpleImputer' object has no attribute '_validate_data' in PyCaret

python - 这个排序算法有名字吗? (选择和合并之间的交叉)

python - Numpy->Cython 转换 : Compile error:Cannot convert 'npy_intp *' to Python object

python - pycharm 调试失败

python - 读取文件时保留最后一行

Python-OpenCV --F 函数错误--找不到正确的目录

python - 如何使用 Altair 按日期时间值突出显示条形

mysql - 无法使用Python将数据从csv文件加载到MySQL表

python-2.7 - Python NLTK 命名实体识别取决于首字母的(大)写?

python-2.7 - 如何在Python中完成递归异步作业后调用函数?