Метод Python List sort, предназначен для сортировки списка в определенном порядке.
prime_numbers = [11, 3, 7, 5, 2]
prime_numbers.sort()
print(prime_numbers)
# Результат: [2, 3, 5, 7, 11]
Синтаксис и параметры метода sort()
Синтаксис метода sort():
list.sort(key=..., reverse=...)
В качестве альтернативы методу sort(), так же можно использовать встроенный метод в python метод sorted(), который в принципе выполняет ту же функцию.
sorted(list, key=..., reverse=...)
Между этими двумя методами есть небольшое различие. Метод sort() отсортирует список напрямую, и не возвращает никаких значений, а метод sorted() не изменяет оригинальный список, а возвращает отсортированный список.
Параметры метода sort()
Метод sort() изначально не требует никаких параметров, но в то же время, у данного метода есть два дополнительных параметра:
- reverse — Если значение True, отсортированный список идет в обратном порядке, либо сортировка выполнена в порядке убывания.
- key — Данный параметр можно указать в качестве ключа для сравнения сортировки
Пример 1. Сортировка списка
vowels = ['e', 'a', 'u', 'o', 'i']
vowels.sort()
print('Sorted list:', vowels)
#Результат
Sorted list: ['a', 'e', 'i', 'o', 'u']
Сортировка списка в порядке убывания
Как мы уже говорили, у метода sort() есть необязательный аргумент reverse. Если мы установим метода reverse=True, то список будет отсортирован в порядке убывания.
list.sort(reverse=True)
Так же можно воспользоваться альтернативным решением, и использовать встроенную функцию в Python, sorted().
sorted(list, reverse=True)
Пример 2. Сортировка в порядке убывания
vowels = ['e', 'a', 'u', 'o', 'i']
vowels.sort(reverse=True)
print(vowels)
#Результат
Sorted list (in Descending): ['u', 'o', 'i', 'e', 'a']
Пользовательская сортировка списка с помощью ключа
Представим себе ситуацию, где нам необходимо реализовать свой собственный метод сортировки. В таком случае, метод sort() принимает в качестве необязательного параметра аргумент key.
list.sort(key=len)
Альтернативный вариант с использованием метода sorted().
sorted(list, key=len)
В данном случае, len() — это встроенная функция Python, которая применяется для подсчета длины каждого элемента. После того, как у нас есть длина каждого элемента, мы можем отсортировать этот список от наименьшего до наибольшего, или наоборот.
Пример 3. Сортировка списка с помощью ключа
def takeSecond(elem):
return elem[1]
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
random.sort(key=takeSecond)
print('Отсортированный список:', random)
#Результат
Отсортированный список: [(4, 1), (2, 2), (1, 3), (3, 4)]
Как видите ключ прекрасно выполнил свою задачу, мы отсортировали данный список по второму элементу. Для более ясного понимания, как все это дело работает, предлагаю рассмотреть еще один пример, чуть по сложнее. Представим себе, что у нас есть список сотрудников компании, каждый элемент данного списка будет являться словарем. Вначале я приведу весь листинг кода вместе с результатом, а затем мы разберем, как это работает.
# Сортировка пользовательским ключом
employees = [
{'Name': 'Alan Turing', 'age': 25, 'salary': 10000},
{'Name': 'Sharon Lin', 'age': 30, 'salary': 8000},
{'Name': 'John Hopkins', 'age': 18, 'salary': 1000},
{'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000},
]
# Функция для получения информации о сотрудниках
def get_name(employee):
return employee.get('Name')
def get_age(employee):
return employee.get('age')
def get_salary(employee):
return employee.get('salary')
# Сортируем по имени(по возрастанию)
employees.sort(key=get_name)
print(employees, end='\n\n')
# Сортировка по возрасту(по возрастанию)
employees.sort(key=get_age)
print(employees, end='\n\n')
# Сортировка по зарплате(по убыванию)
employees.sort(key=get_salary, reverse=True)
print(employees, end='\n\n')
#Результат
[{'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'John Hopkins', 'age': 18, 'salary': 1000}, {'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}]
[{'Name': 'John Hopkins', 'age': 18, 'salary': 1000}, {'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}, {'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}]
[{'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000}, {'Name': 'Alan Turing', 'age': 25, 'salary': 10000}, {'Name': 'Sharon Lin', 'age': 30, 'salary': 8000}, {'Name': 'John Hopkins', 'age': 18, 'salary': 1000}]
- В первом случае, наша функция возвращает нам имена сотрудников. Так как имя у нас является строкой, то соответственно Python сортирует его в алфавитном порядке.
- Второй случай возвращает нам возраст, тип данных которого int(), и сортируется в порядке возрастания
- В третьем случае, функция возвращает зарплату, и ее тип данных тоже int(), в данном случае используется дополнительный параметр reverse со значением True, и сортируется в порядке убывания.
Вышеприведенный код, можно сократить используя lambda функции, такое решение позволит нам свести функцию в одну строку. Соответственно, вышеприведенный код можно переписать следующим образом:
# sorting using custom key
employees = [
{'Name': 'Alan Turing', 'age': 25, 'salary': 10000},
{'Name': 'Sharon Lin', 'age': 30, 'salary': 8000},
{'Name': 'John Hopkins', 'age': 18, 'salary': 1000},
{'Name': 'Mikhail Tal', 'age': 40, 'salary': 15000},
]
# sort by name (Ascending order)
employees.sort(key=lambda x: x.get('Name'))
print(employees, end='\n\n')
# sort by Age (Ascending order)
employees.sort(key=lambda x: x.get('age'))
print(employees, end='\n\n')
# sort by salary (Descending order)
employees.sort(key=lambda x: x.get('salary'), reverse=True)
print(employees, end='\n\n')