Сортировка списка списков по длине и значению в 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]]