根据对象或两个浮点数索引Python字典
我有一些对象需要和一个整数关联起来。这些对象是ArcGIS的点对象(具体是什么不重要),它们存储了一个点的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坐标来查找对应的值。我尝试过把点对象作为字典的键,但这不行,因为当我根据X和Y坐标重新创建点对象时,它就无法正确查找了(可能是因为对象的ID变了)。
我该如何将这些点的值与整数关联起来呢?有没有其他方法可以使用字典?
5 个回答
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
(这里有个关于这个话题的Stack Overflow帖子)。
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))
,这样可以避免对称于对角线的点产生哈希冲突。
然后,你就可以把你的点对象用作字典的键,放进集合等。