如何在python中对2D列表进行排序?

2024-06-25 06:43:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个坐标列表,它指示图像中检测到的单词的左上角位置(前两个值)和右下角坐标(后两个)

它看起来像这样:

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]]

Tags: 图像列表排序可视化方式单词boxesstartx
2条回答

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()

好的,那么您想要的是首先对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]]

这就是所谓的稳定排序。 现在,根据standard library referencesorted函数实现了一个稳定的排序

相关问题 更多 >