mal1kov
@mal1kov
Притворись дураком 5 минут, чем быть им всю жизнь.

Как сортировать и вывести в список места по возрастанию смотря на дистанцию от геопозиции пользователя на python с помощью geopy?

У меня словарь из трёх точек на карте:
STORES: Tuple[dict, ...] = (
    {'title': 'Besh Yogʻoch Savdo',
     'lons': '41.304679',
     'lats': '69.247453',
     'address': 'блабла'},

    {'title': 'Бахт: колбасы и деликатесы',
     'lons': '10.156853',
     'lats': '61.520812',
     'address': 'блабла'},

    {'title': 'Eco - mini market',
     'lons': '41.305242',
     'lats': '69.235547',
     'address': 'блабла'},
)

И обработчик принятого местоположения от пользователя:
def uz_shop_view(message: telebot.types.Message) -> None:
	if message.location is not None:
	    lon: float = message.location.longitude
	    lat: float = message.location.latitude

	    distance: List[...] = []
	    for loc in STORES:
	        result: float = geodesic(
	            (loc['lons'], loc['lats']), (lon, lat)).meters
	        distance.append(result)
	    index = distance.index(min(distance))
	    bot.send_venue(message.chat.id,
	                   STORES[index]['lons'],
	                   STORES[index]['lats'],
	                   STORES[index]['title'],
	                   STORES[index]['address'])
	elif message.location is None:
		bot.reply_to(message, "Отправь местоположение!")

который отправляет пользователю геолокацией наиближайшее место для него.

И вот вопрос:

Как сделать так чтобы тг бот после получения геопозиции отправил в ответ все места списком из словаря отсортировав его в порядке возрастания смотря на расстояние от него?

библиотека: telebot, geopy
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Во-первых, у вас тут нет "словаря", из которого можно "отправить все места списком из словаря". У вас есть tuple - это не словарь. Это кортеж. Кортеж в обычном смысле не сортируется, он по сути своей неизменная структура. Хотя, конечно, если его содержимое переложить в структуру, которая может меняться, то переложенное содержимое отсортировать можно. Но, мне думается, так делать не нужно.

Во-вторых, вы там получаете список дистанций distance. По-идее, индексы значений этого списка соответствуют индексам вашего кортежа, и можно перебирать значения дистанций от максимального к минимальному и по найденному следующему значению получать его индекс и использовать как индекс для получения значения из кортежа.
Грубо говоря, находим максимальное значение в списке distance, считаем его текущим, находим индекс текущего значения, по нему получаем значение из кортежа. Это у вас уже реализовано. А затем ищем значение в списке distance, которое меньше текущего, но больше всех остальных. Считаем его текущим. Получаем его индекс, получаем по этому индексу значение из кортежа, повторяем цикл поиска следующего значения дистанции меньше текущего, пока существует значение дистанции меньше текущего.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 13:31
10000 руб./за проект
19 апр. 2024, в 13:12
35000 руб./за проект
19 апр. 2024, в 13:06
6000 руб./за проект