我的程序生成以下列表(摘录):
my_list = [{'x': 1764, 'y': 18320, 'class': 'note', 'id': 'd1e2443'},
{'x': 1764, 'y': 20030, 'class': 'note', 'id': 'd1e2591'},
{'x': 1807, 'y': 12650, 'class': 'note', 'id': 'd1e1362'},
{'x': 2243, 'y': 20120, 'class': 'note', 'id': 'd1e2609'},
{'x': 2243, 'y': 22685, 'class': 'note', 'id': 'd1e2769'},
{'x': 2257, 'y': 12560, 'class': 'note', 'id': 'd1e1380'},
{'x': 2688, 'y': 20210, 'class': 'note', 'id': 'd1e2625'},
{'x': 2707, 'y': 10040, 'class': 'note', 'id': 'd1e1194'},
{'x': 2707, 'y': 12650, 'class': 'note', 'id': 'd1e1398'},
{'x': 2707, 'y': 14720, 'class': 'note', 'id': 'd1e1571'},
{'x': 2901, 'y': 18140, 'class': 'note', 'id': 'd1e2475'}]
它已经按“x”键的值排序。我正在尝试编写一个方法,该方法针对给定坐标返回此列表的两个元素的元组(xPos, yPos)
:
- 左边最近的元素 (
x <= xPos
) - 最右边的元素 (
x > xPos
)
距离就是欧几里得距离(“毕达哥拉斯”)。该函数的第二个参数是允许的最大距离:
def getNearest(noteList, posX, posY, maxDistance):
[...]
return leftElement, rightElement
我尝试使用 bisect 函数分别获取最近元素的插入点xPos
以及 for xPos - maxDistance
(case 'left') 和xPos + maxDistance
(case 'right) 以缩小搜索区域。然后我计算了这个切片列表中每个剩余元素的距离
不知何故,这感觉非常不雅。有没有更好的方法来做到这一点?
编辑: 也许我的意图不是很清楚:我需要列表的两个元素。“2D 窗格”中最靠近左侧和右侧的元素。因此,我还需要考虑 y 坐标。
可能会发生(实际上几乎每次),就其 x 坐标而言最近的元素比具有接近 y 坐标的元素更远。