Как я могу получить наименьшее расстояние между кортежем и списком кортежей? - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу найти кортеж в списке, который ближе всего к моему данному кортежу.

У меня есть список координат и точка, и мне нужно найти элемент в списке, который ближе всего к моемуточка.

примерно так:


cords =  [(455, 12), (188, 90), (74, 366), (10,10)]
point = (18, 448)

for c in cords:
    dst = distance.euclidean(cords[c], point)

Output = closest distance

Я пытался использовать scipy.spatial.distance.euclidean, но это выдает ошибку:

TypeError: индексы списка должны быть целыми числами или частями, а не кортежем

Ответы [ 4 ]

2 голосов
/ 24 сентября 2019

Python min позволяет указать функцию с одним аргументом, которая возвращает значение ("key"), и возвращает элемент, который его минимизирует.

min(cords, key=lambda c : distance.euclidean(c, point))
2 голосов
/ 24 сентября 2019

c - это кортеж в списке координат, это не индекс, поэтому используйте его вместо cords[c], вы также можете использовать min с выражением генератора, чтобы получить то, что вы хотите:

from scipy.spatial.distance import euclidean

cords =  [(455, 12), (188, 90), (74, 366), (10, 10)]
point = (18, 448)

closest_dst = min(euclidean(c, point) for c in cords)
print(closest_dst)

Выход:

99.29753269845128
1 голос
/ 24 сентября 2019

Вы передаете ему объект c в качестве индекса.Вы можете сделать это, используя перечисление, если вы хотите использовать индекс или просто сделать это по-питонски:

cords =  [(455, 12), (188, 90), (74, 366), (10,10)]
point = (18, 448)

for c in cords:
    dst = distance.euclidean(c, point)

Вы должны сохранить расстояния и найти минимум.

1 голос
/ 24 сентября 2019

Попробуйте for c in range(len(cords)).Как и вы, вы берете элементы списка в c, а не в индексы.

...