Как вы сортируете 2D список в python? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть список координат, которые указывают верхнюю левую позицию (первые два значения) и нижнюю правую координаты (последние два) обнаруженного слова в изображении

Это выглядит что-то вроде этого:

boxes= [[ 27,  22,  84 , 54],
     [261 ,127 ,294 ,163],
     [224 , 21 ,279 , 54],
     [ 45  ,83 , 96 ,111],
     [ 10 ,126 , 66 ,163],
     [189 ,185 ,219 ,222],
     [154 , 21 ,192 , 59],
     [278 , 25 ,318 , 58],
     [146 ,188 ,186, 220]]

поэтому в полях [0] я получу [27,22,84,54] и назовем их startX, startY, endX, endY соответственно

Для визуализация:

 (27,22)------------.
    '               '
    '               '
    '               '
    '---------------(84,54)

Мне нужно отсортировать это так, чтобы startY начинал быть минимальным с увеличением startX и startY с увеличением

, поэтому вывод должен выглядеть примерно так

     [[154 , 21 ,192 , 59],
     [224 , 21 ,279 , 54],
     [ 27,  22,  84 , 54],
     [278 , 25 ,318 , 58],
     [ 45  ,83 , 96 ,111],
     [ 10 ,126 , 66 ,163],
     [261 ,127 ,294 ,163],
     [189 ,185 ,219 ,222],
     [146 ,188 ,186, 220]]

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Python будет сортировать кортеж на основе позиции, поэтому вы можете передать key в sorted(), который помещает элементы в порядок, на котором вы хотите основать сортировку:

boxes= [[ 27,  22,  84 , 54],
     [261 ,127 ,294 ,163],
     [224 , 21 ,279 , 54],
     [ 45  ,83 , 96 ,111],
     [ 10 ,126 , 66 ,163],
     [189 ,185 ,219 ,222],
     [154 , 21 ,192 , 59],
     [278 , 25 ,318 , 58],
     [146 ,188 ,186, 220]]

sorted(boxes, key=lambda x: (x[1], x[0], x[2], x[3]))

Результат:

[[154, 21, 192, 59],
 [224, 21, 279, 54],
 [27, 22, 84, 54],
 [278, 25, 318, 58],
 [45, 83, 96, 111],
 [10, 126, 66, 163],
 [261, 127, 294, 163],
 [189, 185, 219, 222],
 [146, 188, 186, 220]]

Если вы хотите отсортировать список на месте, используйте boxes.sort() с тем же ключом.

0 голосов
/ 06 апреля 2020

ОК, так что вам нужно сначала отсортировать по startX, а затем по startY, соблюдая при этом относительный порядок между элементами в startX. Это будет выглядеть так:

# Input:
[[ 27,  22,  84 , 54],
 [261 ,127 ,294 ,163],
 [224 , 21 ,279 , 54],
 [ 45  ,83 , 96 ,111],
 [ 10 ,126 , 66 ,163],
 [189 ,185 ,219 ,222],
 [154 , 21 ,192 , 59],
 [278 , 25 ,318 , 58],
 [146 ,188 ,186, 220]]
# First sort:
[[ 10 ,126 , 66 ,163],
 [ 27,  22,  84 , 54],
 [ 45  ,83 , 96 ,111],
 [146 ,188 ,186, 220],
 [154 , 21 ,192 , 59],
 [189 ,185 ,219 ,222],
 [224 , 21 ,279 , 54],
 [261 ,127 ,294 ,163],
 [278 , 25 ,318 , 58]]
# Second sort:
[[154 , 21 ,192 , 59],
 [224 , 21 ,279 , 54],
 [ 27,  22,  84 , 54],
 [278 , 25 ,318 , 58],
 [ 45  ,83 , 96 ,111],
 [ 10 ,126 , 66 ,163],
 [261 ,127 ,294 ,163],
 [146 ,188 ,186, 220],
 [189 ,185 ,219 ,222]]

Это то, что называется стабильной сортировкой. Теперь, согласно стандартной справочной библиотеке , функция sorted реализует стабильную сортировку.

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