#python #list #sorting
#python #Список #сортировка
Вопрос:
Я пытаюсь сгенерировать список позиций (от 0 до n) для точек (уличных фонарей) на основе их расстояния до других точек (улицы).
Списки выглядят следующим образом :
lightpoint_list = [14, 20, 1, 1, 12, 6]
distance_list = [3.79, 7.91, 9.27, 22.14, 13.91, 1.27]
order_list = [0, 1, 2, 3, 4, 5]
Порядок, в котором они отображаются, важен, поскольку я должен добавить эти данные в Dataframe и соблюдать их первоначальный порядок. Например :
FID X Y lightpoint_list distance_list order
1 45.33 69.32 14 3.79
2 45.32 69.22 20 7.91
3 45.31 69.20 1 9.27
4 45.28 69.19 1 22.14
5 45.20 69.21 12 13.91
6 45.22 69.31 6 1.27
В этом сценарии значение FID 1 не обязательно означает, что эта точка является первой на улице, только то, что она была введена первой. Мне нужно упорядочить эти точки по их
порядок появления на улице. Для этого я сопоставил каждую световую точку с ближайшей точкой на улице, разделив линию на точки. Эти результаты хранятся в
lightpoint_list, где каждое значение является значением индекса соответствующей конечной точки сегмента на улице. Мы хотим сгенерировать порядок, начинающийся с 0 и переходящий в n (в
этот конкретный пример, 5) на основе порядка их появления на улице (т. Е. значения lightpoint_list).
Из этого мы понимаем, что значение lightpoint_list 1 появляется перед 6 и так далее. distance_list генерируется в случае, если 2 lightpoint_list имеют одинаковое значение. Если это произойдет, это означает, что 2 уличных фонаря находятся ближе к точке 1 (в данном случае), чем любые другие точки на улице. Чтобы узнать, какая точка стоит первой в порядке появления, расстояние между уличным фонарем и сегментированной точкой улицы вычисляется и сохраняется в списке расстояний.
Тогда мы понимаем, что если в lightpoint_list нет дубликатов, нам не нужен distance_list и мы можем просто ранжировать точки в порядке возрастания. Однако, если у нас есть дубликаты (как в этом случае), нам нужно обратиться к расстоянию этих дубликатов и отсортировать их по возрастанию расстояния.
Результатом этого будет :
order_list = [4, 5, 0, 1, 3, 2]
которые я мог бы добавить к фрейму данных следующим образом :
FID X Y lightpoint_list distance_list order
1 45.33 69.32 14 3.79 4
2 45.32 69.22 20 7.91 5
3 45.31 69.20 1 9.27 0
4 45.28 69.19 1 22.14 1
5 45.20 69.21 12 13.91 3
6 45.22 69.31 6 1.27 2
Комментарии:
1. Не могли бы вы, пожалуйста, назвать все эти списки и более четко указать входные и желаемые выходные данные
2. И список, который имеет минимальное расстояние между точкой освещения и точкой улицы, как он может содержать 5 элементов? Расстояние между 5 точками будет иметь 4 значения? Не так ли?
3. Ну вот, Раман, я обновляю вопрос. Я надеюсь, что это проще для понимания. Если что-то непонятно, дайте мне знать. Спасибо!
4. Я все еще не понимаю, что вы пытаетесь сделать. Это может помочь проиллюстрировать, если вы покажете написанный вами код, чтобы попытаться решить это самостоятельно.
5. Я не понимаю, как вы вычисляете этот результат. Можете ли вы рассказать о том, как генерировать некоторые элементы вручную? Почему
4
первый элемент? Почему2
последний элемент?
Ответ №1:
Если я вас правильно понимаю, вы хотите сначала отсортировать по lightpoint_list
, если lightpoint совпадает, затем отсортировать по distance_list
. итак, решение понятно, вы можете просто упаковать и отсортировать:
lightpoint_list = [14, 20, 1, 1, 12, 6]
distance_list = [3.79, 7.91, 9.27, 22.14, 13.91, 1.27]
order_list = [0, 1, 2, 3, 4, 5]
sorted_data = sorted(zip(lightpoint_list, distance_list, order_list))
print(f"sorted_data={sorted_data}")
for i, data in enumerate(sorted_data):
order_list[data[2]] = i
print(f"order_list={order_list}")
вывод:
sorted_data=[(1, 9.27, 2), (1, 22.14, 3), (6, 1.27, 5), (12, 13.91, 4), (14, 3.79, 0), (20, 7.91, 1)]
order_list=[4, 5, 0, 1, 3, 2]
Надеюсь, это поможет вам, и прокомментируйте, если у вас возникнут дополнительные вопросы. : )
Комментарии:
1. Это сделало это! Большое вам спасибо, я этого никогда не забуду, хе-хе 🙂