因此,我正在使用以下格式的列表中的多个列表:
places = [place_id: int, distance1: float, distance2: float]
distance1
和distance2
是坐标。
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
并将其与列表1
和3
上的所有元素进行比较。
我当时想我可以创建一个具有所有距离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
编辑:无法使用math
和csv
以外的模块的帮助
答案 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]