Сортировка списка списков по длине и значению в Python

Как я могу отсортировать список Python (с подсписками)? Например, у меня есть следующий список:

list1 = [[0, 4, 1, 5], [3, 1, 5], [4, 0, 1, 5]]

После сортировки я ожидаю:

list1 = [[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]

Другой пример. У меня есть следующий список:

list2 = [[4, 5, 2], [2, 5, 4], [2, 4, 5]]

После сортировки я ожидаю:

list2 = [[2, 4, 5], [2, 5, 4], [4, 5, 2]]

Сначала я хочу сортировать по длине, а затем по положению в каждом подсписке. Я не хочу сортировать подсписку.

Я пробовал следующий код, который помог мне отсортировать только по длине:

list1.sort(key=len)

Ответ 1

Вам нужен ключ:

lambda l: (len(l), l)

Как:

Это использует lambda для создания tuple который можно использовать sorted для сортировки по желанию. Это работает, потому что набор элементов сортируется по элементу.

Тестовый код:

list1 = [[0, 4, 1, 5], [3, 1, 5], [4, 0, 1, 5]]
print(sorted(list1, key=lambda l: (len(l), l)))

list2 = [[4, 5, 2], [2, 5, 4], [2, 4, 5]]
print(sorted(list2, key=lambda l: (len(l), l)))

Результаты:

[[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
[[2, 4, 5], [2, 5, 4], [4, 5, 2]]

Ответ 2

Метод python list.sort() является "стабильным", т.е. Относительный порядок элементов, сравнивающих одинаковые, не изменяется. Поэтому вы также можете добиться желаемого порядка, вызвав sort() дважды:

>>> list1 = [[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
>>> list1.sort()  # sort by sublist contents
>>> list1.sort(key=len)  # sort by sublist length
>>> list1
[[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]