Сортировка списка позиций на основе значений, хранящихся в 2 других списках

#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. Это сделало это! Большое вам спасибо, я этого никогда не забуду, хе-хе 🙂