Сортировка по двум / нескольким критериям
Требуется функцией sorted вернуть список, отсортированный по двум критериям, как это сделать?
К примеру есть список строк, которые надо отсортировать по длине, а строки одной длины в алфавитном порядке между собой
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
есть список строк, которые надо отсортировать по длине, а строки одной длины в алфавитном порядке между собой
Пример:
In [29]: strings = ['cc', 'aa', 'bbb', 'aaa', 'ddd', 'bb']
In [30]: sorted(strings, key=lambda x: (len(x), x))
Out[30]: ['aa', 'bb', 'cc', 'aaa', 'bbb', 'ddd']
Другой пример - сортируем список списков сначала по второму элементу (по возрастанию), а потом по третьему элементу (по убыванию):
In [37]: data = [["Max", "Mustermann", 66], ["John", "Doe", 33], ["Janie ", "Doe", 44]]
In [38]: sorted(data, key=lambda x: (x[1], -x[2]))
Out[38]: [['Janie ', 'Doe', 44], ['John', 'Doe', 33], ['Max', 'Mustermann', 66]]
Менее тривиальный пример - сортируем список имен и фамилий - сначала сортируем по фамилии в алфавитном порядке, затем по имени в обратном порядке:
In [47]: data = [["Max", "Mustermann"], ["John", "Doe"], ["Janie", "Doe"], ["Abigale", "Doe"]]
In [48]: sorted(data, key=lambda x: (x[1], [-ord(c) for c in x[0]]))
Out[48]: [['John', 'Doe'], ['Janie', 'Doe'], ['Abigale', 'Doe'], ['Max', 'Mustermann']]
Автор решения: George61
→ Ссылка
data = [["Max", "Mustermann"],["John", "Doe"],["Janie", "Doe"],["Abigale", "Doe"]]
data1 = sorted(data, key=lambda x: (x[1], -ord(x[0][0])))
print(data1)
[['John', 'Doe'], ['Janie', 'Doe'], ['Abigale', 'Doe'], ['Max', 'Mustermann']]