Сортировка списка позиций на основе значений, сохраненных в 2 других списках - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь создать список позиций (от 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]

что я мог бы добавить к Dataframe следующим образом:

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 Ответ

1 голос
/ 04 мая 2019

Если я вас правильно понимаю, вы хотите сначала отсортировать по lightpoint_list, если точка освещения такая же, то по 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}")

output:

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]

Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...