索引python dict由对象或两个浮点数

时间:2011-01-21 19:56:55

标签: python hash dictionary floating-point

我有许多对象需要链接到整数。这些对象是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已更改)

我应该如何将这些点值链接到整数。还有其他方法可以使用字典吗?

5 个答案:

答案 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代替strhere's该主题的Stack Overflow帖子。

答案 2 :(得分:1)

答案 3 :(得分:1)

答案 4 :(得分:1)

像Payne所说的那样,在点类中添加__hash__()方法。或者手动计算每个点的哈希值。在任何情况下,使用类似Python原生的东西:

...
def __hash__(self):
    return hash( (self.x, self.y ) )
...