【问题标题】:from list of tuples, get tuple closest to a given value从元组列表中,获取最接近给定值的元组
【发布时间】:2015-02-05 08:19:56
【问题描述】:

给定一个包含坐标的元组列表,我想找出哪个坐标最接近我在输入中给出的坐标:

cooList = [(11.6702634, 72.313323), (31.67342698, 78.465323)]
coordinate = (11.6702698, 78.113323)
takenearest(myList, myNumber)
...
(11.6702634, 72.313323)

请告诉我...

【问题讨论】:

  • 展示你的尝试..
  • 如果您向我们展示您已经尝试过的内容,它将帮助我们为您提供更好的答案。这样你就不会说“哦,谢谢你的帮助,但我已经试过了。”
  • 你如何定义距离?

标签: python list tuples coordinates


【解决方案1】:

为了您的数据

cooList = [(11.6702634, 72.313323), (31.67342698, 78.465323)]
coordinate = (11.6702698, 78.113323)

最短的 Pythonic 答案是:

nearest = min(cooList, key=lambda x: distance(x, coordinate))

使用函数 distance(a, b) 将点 ab 之间的距离返回为浮点数,您必须自己定义。

现在您必须决定如何计算距离:使用简单的a² + b² = c²、一些地理公式或专用库。

【讨论】:

  • 出现错误:NameError: global name 'distance' is not defined
  • @Jothimani 请不要告诉我你不能谷歌python points distance
  • @Jothimani:您可以使用math.hypot() 函数来计算欧几里得距离。但是请注意,您实际上并不需要实际距离来找到最近的 d1 < d2 — 进行距离比较时的一个常见加速方法是使用距离 squared,这避免了计算- 昂贵的平方根以获得实际距离。这是因为对于正数,如果 d1 < d2d1² < d2² 也为真。
【解决方案2】:

如果我理解正确,您需要列表中与给定坐标距离最短的坐标。这意味着您可以像这样遍历列表:

def closest_coord(list, coord):
    closest = list[0]
    for c in list:
        if distance(c, coord) < distance(closest, coord):
            closest = c
    return closest

要计算两个变量之间的距离,只需使用毕达哥拉斯。

def distance(co1, co2):
    return sqrt(pow(abs(co1[0] - co2[0]), 2) + pow(abs(co1[1] - co2[2]), 2))

我希望这会有所帮助!

【讨论】:

  • 您可以跳过sqrt 以提高速度。
  • 我知道,对于这种情况,它会起作用,但是,返回的值将不再是两点之间的距离。如果@Jothimani 需要特殊的速度,因为他们的列表有点大(例如),他们可以修改代码以使其符合他们的需求。
【解决方案3】:
>>> min(cooList, key=lambda c: (c[0]- coordinate[0])**2 + (c[1]-coordinate[1])**2)
(11.6702634, 72.313323)

【讨论】:

  • 呃。为什么不使用一些 Python 函数,例如 minmath.hypot?无需重新发明轮子......
  • @sloth 在这里。 ;-)
  • 你也可以使用key=lambda c: math.hypot(c[0]- coordinate[0], c[1]-coordinate[1])。请注意,您还有一个错字:coordinate[0] 而不是 coordinate[1]
  • 感谢指正。我同意 math.hypot 在某种意义上更好,但有时我认为数学库确实过度设计了。
  • 欧几里得距离对经纬度不是很有用。对于小距离来说还可以,但对于较大的距离和/或在两极附近的地区,效果就不太好了。
猜你喜欢
  • 2018-06-05
  • 2020-09-07
  • 2021-05-30
  • 2018-08-27
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多