返回与两个列表之间的最小距离关联的id

时间:2018-10-19 22:21:10

标签: python python-3.x

因此,我正在使用以下格式的列表中的多个列表:

places = [place_id: int, distance1: float, distance2: float]

distance1distance2是坐标。

places = [
         [1, 12.2, 1.2]
         [2, 12.2, 2.3]
         [3, 22.1, 3.2]
         ]

我有一个公式,可以获取两个地方之间的距离,一个公式可以获取以下形式的列表:

d_between(place1, place2) g_place(lists, place_id)

我希望脚本比较确定位置与列表中所有其他位置之间的距离,并返回最接近该位置的place_id。假设2并将其与列表13上的所有元素进行比较。

我当时想我可以创建一个具有所有距离distances的新列表,并使用min()来获得最小的距离;但我不知道如何使它返回与列表关联的place_id

from typing import List, TextIO

def distance(places: List[list], place_id: int) -> int:
"""Return the id of the place in places, that is the closest to the place 
with id place_id


Distance between list2 and list1: 20 meters
Distance between list2 and list3: 60 meters

>>>distance(lists, 2)
1
"""
distances = []

for aplace in places:
    if aplce[0] != place_id:
        distances.append(aplace)

for aplace in distance:
    d_beetween(aplace, g_place(places, place_id))

从这里开始,我在所有列表之间循环,但不确定如何获取最近位置的ID

编辑:无法使用mathcsv以外的模块的帮助

3 个答案:

答案 0 :(得分:0)

保存一个元组(id, distance)而不是仅保存distance,并将min键指定为x[1],以使用distance作为参考。这样,您的函数将返回一个元组(id, min_distance)

distances = []

for aplace in places:
    if d_between(aplace, place_id):
        distances.append((aplace[0], d_between))
return min(s_distances, key=lambda x: x[1])

答案 1 :(得分:0)

为此,您将使用key的{​​{1}}参数,该参数必须作为关键字参数给出。该值应该是一个函数,该函数接受单个参数list元素(在您的情况下为ID),然后返回该值,该值应进行比较以确定最小值(在您的情况下为距参考位置的距离)。

min()

如果愿意,您当然可以为def distance_from_id(place) -> float: place_id = place[0] # ... return distance min((p in places if p[0] != reference_id), key=distance_from_id) 使用lambda函数。

我指定了key而不是(p in places if p[0] != reference_id),因为您应该排除参考位置(您正在计算参考位置的位置);否则它的距离将为零,并且始终是返回的位置。有几种方法可以排除这种情况。

答案 2 :(得分:0)

我基本上做了这个,很久了...

p_list = []
p_min_list = []

for alist in places:
    if alist[0] != place_id:
        p_list.append(alist)

for aplace in p_list:
    b_min.append((aplace[0], d_between(aplace, g_place(places, place_id))))

for avalue in p_min_list:
    return min(p_min)[0]