Python 使用字典查找附近的点

Python 使用字典查找附近的点,python,dictionary,Python,Dictionary,我正试图在字典中找到与其他点最近的点。在这本词典中,关键点是点坐标,如下所示 print d1 {(1, 1): 0, (2, 1): 1, (3, 1): 2, (10, 41):3} 这里的输出应该是另一个字典,其中键作为每个位置,值是附近点的列表。附近的点定义为距离任何其他点+/-1(如果没有附近的点,则可以将类似“nan”的值设置为一个值) 例如,此处的输出应如下所示: {(1, 1): [(2,1)], (2, 1): [(1,1), (3,1)], (3, 1): [(2,1)],

我正试图在字典中找到与其他点最近的点。在这本词典中,关键点是点坐标,如下所示

print d1
{(1, 1): 0, (2, 1): 1, (3, 1): 2, (10, 41):3}
这里的输出应该是另一个字典,其中键作为每个位置,值是附近点的列表。附近的点定义为距离任何其他点
+/-1
(如果没有附近的点,则可以将类似“nan”的值设置为一个值)

例如,此处的输出应如下所示:

{(1, 1): [(2,1)], (2, 1): [(1,1), (3,1)], (3, 1): [(2,1)], (10, 41): nan}

您可以使用列表理解来迭代原始字典的键和值,并在字典中搜索类似的键。如果找不到任何键的结果,则持久、简单的筛选将创建
“nan”

d = {(1, 1): 0, (2, 1): 1, (3, 1): 2, (10, 41):3}
new_d = {a:[c for c, b in d.items() if any(abs(i-a[0]) == 1 or abs(i-a[-1])==1 for i in c) and c != a] for a, h in d.items()}
final_d = {a:"nan" if not b else b for a, b in new_d.items()}
使用
math.hypot()的替代解决方案


欢迎来到堆栈溢出!您似乎在要求某人为您编写一些代码。堆栈溢出是一个问答网站,而不是代码编写服务。请学习如何写有效的问题。似乎无法获得您的输出。我得到的结果如下:
{(1,1):[(3,1),(10,41),(2,1)],(2,1):[(3,1),(10,41),(1,1):[(10,41),(1,1),(2,1)],(10,41):[(3,1),(1,1),(2,1)]
除了你回答了一个非常糟糕的问题之外,你的答案毫无意义。如果关键点是点坐标,似乎需要使用类似的东西来确定它们之间的欧几里德距离(这对于确定“接近度”是必要的)。@user3067923这很奇怪,我没有收到
{(1,1):[(3,1),(10,41),(2,1)],(2,1):[(3,1),(10,41),(1,1)],(3,1:[(10,41),(1),(2,1)],(10, 41): [(3, 1), (1, 1), (2, 1)]}
当我运行此代码时。您是否完全运行了上面发布的代码?@martineau关于
数学的好主意。hypot
。我在OP的帖子中忽略了欧几里德距离的概念。请参阅我最近的编辑。有点改进,但是数学是错误的。您需要将每对数据的x值和y值的差异传递给它点。即点
p1
p2
之间的距离将是
hypot(p2[0]-p1[0],p2[1]-p1[1])
。您也不需要所有这些
abs()
调用,因为由于所涉及的
sqrt()
(在
math.hypot()
中),返回的距离将始终是非负值。
import math
new_d = {a:[c for c, b in d.items() if math.hypot(a[0]-c[0], a[1]-c[1])<= 1 and c != a] for a, h in d.items()}
final_d = {a:"nan" if not b else b for a, b in new_d.items()}
{(3, 1): [(2, 1)], (10, 41): 'nan', (1, 1): [(2, 1)], (2, 1): [(3, 1), (1, 1)]}