我有许多对象需要链接到整数。这些对象是ArcGIS Point对象(确切地说它们不相关),它将点的X和Y值存储为浮点数。
我需要记录下来,例如:
Point(X = 2.765, Y = 3.982) -> 2
Point(X = 33.9, Y = 98.45) -> 7
Point(X = 1.23, Y = 2.43) -> 9
Point(X = 8.342, Y = 6.754) -> 5
然后,我需要能够通过X和Y值查找结果值。我已经尝试使用Point对象作为字典的键,但这不起作用,因为当我从X和Y值重新创建点对象时它不再正常查找(可能是因为对象ID已更改)
我应该如何将这些点值链接到整数。还有其他方法可以使用字典吗?
答案 0 :(得分:10)
向Point类添加哈希方法:
...
def __hash__(self):
return hash(self.x) ^ hash(self.y)
...
换句话说,一个点的哈希是x和y坐标的哈希值。
编辑:更好的哈希函数(基于此处的注释)是:
...
def __hash__(self):
return hash((self.x, self.y))
...
因为Python以hash((p,q))
不等于hash((q,p))
的方式散列元组,所以这将避免对于对角线对称的点的哈希碰撞。
然后,您可以使用Point对象作为词典的键,将它们放在一组等等。
答案 1 :(得分:4)
Python字典键需要是不可变类型。
您可以使用(2.765, 3.982)
之类的元组。只要元组只包含不可变类型,它就可以用作字典键。
这是我在控制台中的测试:
>>> my_dict[(12.3151, 1.2541)] = "test"
>>> my_dict[(12.3151, 1.2541)]
'test'
你可以提出一个像"2.765, 3.982"
之类的简单字符串约定来将一个点转换为索引,但这会浪费处理。另外,请注意:如果由于某种原因您选择执行此操作,则必须使用repr
代替str
(here's该主题的Stack Overflow帖子。
答案 2 :(得分:1)
答案 3 :(得分:1)
答案 4 :(得分:1)
像Payne所说的那样,在点类中添加__hash__()
方法。或者手动计算每个点的哈希值。在任何情况下,使用类似Python原生的东西:
...
def __hash__(self):
return hash( (self.x, self.y ) )
...