Для этого можно использовать параметр key
функции сортировки:
l = [[[ -1000 , 97 ],[999 , 98]],
[[410 , -1048], [619 , 940]],
[[-1000, 226],[999 , 227]],
[[229 , -983],[55 , 1008]]]
sorted(l, key=lambda x: (min(x[0][0], x[1][0]), max(x[0][0],x[1][0])))
>>> [[[-1000, 97], [999, 98]],
[[-1000, 226], [999, 227]],
[[229, -983], [55, 1008]],
[[410, -1048], [619, 940]]]
Лямбда внутри отсортированного создает кортеж, содержащий минимальное и максимальное значение x
И если вы работаете с Numpy, вы можете написать что-то, что лучше обобщать в более высоких измерениях:
sorted(l, key=lambda x: sorted(x[..., 0]))
>>> [array([[-1000, 97], [ 999, 98]]),
array([[-1000, 226], [ 999, 227]]),
array([[ 229, -983], [ 55, 1008]]),
array([[ 410, -1048], [ 619, 940]])]
Это работает, даже если у вас есть более 2 точек для определения вашей формы и будет сортировать по минимальному x
значению
EDIT:
Исправление для сортировки внутренних точек внутри прямоугольника:
sorted(np.sort(l, axis=1), key=lambda x: tuple(x[..., 0]))