Как отсортировать многомерный массив по любому столбцу в любом необходимом порядке в Python

#python #python-3.x #sorting #lambda #key

#python #python-3.x #сортировка #лямбда #Клавиша

Вопрос:

Мне нравится, чтобы Python 2D array сортировался по возрастанию первого столбца, чем по убыванию второго столбца и по возрастанию третьего столбца. Итак, функция сортировки сначала попытается отсортировать элементы в первом столбце, если значение первого столбца такое же, затем она попытается отсортировать на основе значения второго столбца по убыванию, даже если значение второго столбца такое же, затем она попытается отсортировать на основе третьего столбцазначение в порядке возрастания.

Итак, если у меня есть такой Python array

 [[15, 18, 2], [1, 3, 3], [7, 10, 8], [1, 2, 1], [8, 11, 5], [8, 10, 5], [1, 6, 1], [1, 6, 2]]
  

Тогда для данного массива вывод должен быть таким-

 [[1, 6, 1], [1, 6, 2] [1, 3, 3], [1, 2, 1], [7, 10, 8], [8, 11, 5], [8, 10, 5], [15, 18, 2]]
  

Для этого я должен использовать python lambda функцию. Что я сделал, так это-

 intervals = [[15, 18, 2], [1, 3, 3], [7, 10, 8], [1, 2, 1], [8, 11, 5], [8, 10, 5], [1, 6, 1], [1, 6, 2]]
................
................
intervals.sort(key=lambda x: x[2] or x[1] and x[0])
  

После этого я получаю примерно следующее-

 [[1, 2, 1], [1, 6, 1], [15, 18, 2], [1, 6, 2], [1, 3, 3], [8, 11, 5], [8, 10, 5], [7, 10, 8]]
  

Что не так, как ожидалось. Есть ли какой-нибудь способ найти то, что мне нужно?

Заранее спасибо за помощь.

Ответ №1:

Поскольку ваши значения являются числовыми, вы можете отрицать их для сортировки по убыванию, поэтому для сортировки по x[0] возрастанию, x[1] убыванию и x[2] возрастанию вам просто нужно отсортировать по кортежу (x[0], -x[1], x[2]) :

 intervals = [[15, 18, 2], [1, 3, 3], [7, 10, 8], [1, 2, 1], [8, 11, 5], [8, 10, 5], [1, 6, 1], [1, 6, 2]]

intervals.sort(key=lambda x:(x[0], -x[1], x[2]))
print(intervals)
  

Вывод:

 [[1, 6, 1], [1, 6, 2], [1, 3, 3], [1, 2, 1], [7, 10, 8], [8, 11, 5], [8, 10, 5], [15, 18, 2]]