假设我具有以下Point Class。
class POINT:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
主要功能:
def main():
mySet = set()
a = POINT(1,2)
mySet.add(a)
b = POINT(1,2)
print("B is in mySet= {}".format(b in mySet))
我想知道一种检查对象(点)是否在集合中的有效方法。
我知道两种方法来实现它,但是它们要么效率不高,要么不使用自定义对象:
- 遍历集合中的所有点对象-> O(n)
- 使用集合表示点。即(mySet中的(1,2)->不使用自定义对象
我相信在使用关键字in
时,它将检查对象的ID或哈希值。我想知道哪个关键术语可以让我检查集中的对象的值。
答案 0 :(得分:0)
我们可以将这个问题改写为“如何对自定义对象使用in
关键术语?”
我们需要在自定义类中定义哈希。我们该怎么做?
我们需要考虑两种主要情况:
如果我们定义hash = self.x + self.y
,则可能会发生冲突,因为Point(x,y)和Point(y,x)会给出相同的哈希值,并且不应该是哈希值,因为它们的x和y不同。
避免这种情况的一种方法是使用内置对象的哈希函数。我们可以将self.x
和self.y
转换为元组对象,以便它可以与哈希函数一起使用。其效率取决于Python如何实现hash()。
class POINT:
def __hash__(self):
return hash((self.x, self.y))