В цьому записі буде розглянуто використання методу sort() для сортування списків у Python, а також його відмінність від вбудованої функції sorted().
Метод sort() – синтаксис
Метод sort() у Python використовується для сортування елементів списку “на місці”, тобто змінюється сам список, без створення його копії.
Загальний синтаксис методу sort() виглядає наступним чином:
list_name.sort(key=None, reverse=False)- list_name: ім’я списку, котрий піддається сортуванню.
- key: необов’язковий іменований параметр, для визначення функції яка буде застосована до кожного елемента списку, щоб отримати ключ порівняння (наприклад key=str.lower). Ключ обчислюється один раз для кожного елемента списку, після чого використовується для всього процесу сортування. Значення за замовчуванням None – означає що елементи списку будуть відсортовані без обчислення ключів. Простіше кажучи, використовуючи параметр key можна визначити власні критерії сортування списку.
- reverse: необов’язковий іменований параметр, якщо встановлено у True, сортування списку відбудеться у зворотному порядку.
Метод sort() повертає значення None, тобто він не повертає жодного значення, оскільки він лише модифікує початковий список, а не повертає новий список.
Сортування елементів списку за зростанням або спаданням використовуючи метод sort()
За замовчуванням метод sort() сортує елементи списку за зростанням. Розглянемо приклади сортування:
numbers = [5, 10, 1]
numbers.sort()
print(numbers)
# [1, 5, 10]
letters = ['c', 'a', 'b']
letters.sort()
print(letters)
# ['a', 'b', 'c']Як видно з обох прикладів, відбулася модифікація (зміна порядку елементів), саме оригінальних списків.
Щоб відсортувати елементи списку за спаданням, потрібно використати необов’язковий параметр reverse методу sort(), встановивши його значення у True. Приклади:
numbers = [5, 10, 1]
numbers.sort(reverse=True)
print(numbers)
# [10, 5, 1]
letters = ['c', 'a', 'b']
letters.sort(reverse=True)
print(letters)
# ['c', 'b', 'a']Сортування елементів списку з використанням параметра key методу sort()
Для власного налаштування операції сортування елементів списку, можна використовувати параметр key. Функція (або метод) призначена параметру key, буде застосована до всіх елементів списку до того, як відбудеться сортування, і визначатиме логіку критеріїв сортування.
Уявімо, що є потреба відсортувати список рядків за їх довжиною. Для цього призначимо параметру key вбудовану функцію len(). Функція len() обчислить довжину кожного елемента списку, шляхом підрахунку символів у рядку, після чого вже відбудеться сортування списку, що базується на отриманих значеннях. Приклад:
programming_languages = ['Python', 'Java', 'C++']
programming_languages.sort(key=len)
print(programming_languages)
# ['C++', 'Java', 'Python']
programming_languages.sort(key=len, reverse=True)
print(programming_languages)
# ['Python', 'Java', 'C++']Також при потребі можна створити власну функцію ключ для сортування, і відсортувати список відповідно до значень, які вона повертає при застосуванні до елементів списку.
Уявімо, що у нас є список persons зі словниками котрі містять інформацію про особу (ім’я, рік народження), і є потреба відсортувати цей список за роком народження person:
people = [
{'name': 'Alice', 'year_of_birth': 1990},
{'name': 'Bob', 'year_of_birth': 1985},
{'name': 'Charlie', 'year_of_birth': 2000}
]Визначимо функцію, яка отримує значення ключа словника year_of_birth:
def get_year(element):
return element['year_of_birth']Значення котре повертає get_year(), буде застосовано як критерій сортування списку. Код прикладу загалом:
persons = [
{'name': 'Alice', 'year_of_birth': 1990},
{'name': 'Bob', 'year_of_birth': 1985},
{'name': 'Charlie', 'year_of_birth': 2000}
]
def get_year(element):
return element['year_of_birth']
persons.sort(key=get_year)
print(persons)
# [{'name': 'Bob', 'year_of_birth': 1985}, {'name': 'Alice', 'year_of_birth': 1990}, {'name': 'Charlie', 'year_of_birth': 2000}]Для досягнення аналогічного результату можна скористатись lambda-функцією, що зробить код більш компактним:
persons = [
{'name': 'Alice', 'year_of_birth': 1990},
{'name': 'Bob', 'year_of_birth': 1985},
{'name': 'Charlie', 'year_of_birth': 2000}
]
persons.sort(key=lambda element: element['year_of_birth'])
print(persons)
# [{'name': 'Bob', 'year_of_birth': 1985}, {'name': 'Alice', 'year_of_birth': 1990}, {'name': 'Charlie', 'year_of_birth': 2000}]Відмінність між методом sort() та функцією sorted()
Метод sort() працює схожим чином до вбудованої функції Python – sorted(). Загальний синтаксис функції sorted() виглядає наступним чином:
sorted(iterable_object, reverse=..., key=...)- функція sorted() повертає новий відсортований список, який отримано з ітерованого об’єкту, котрий було передано їй в якості обов’язкового аргументу
- sorted(), так само як і sort(), підтримує необов’язкові іменовані параметри, котрі дозволяють керувати сортуванням: reverse та key
- sorted() завжди повертає список
Основна відмінність між sort() та sorted() полягає в тому, що функція sorted() отримує список і повертає його нову відсортовану копію. Копія містить елементи вихідного списку у відсортованому порядку. При цьому вихідний список залишається незмінним.
Метод sort() повертає None, та модифікує саме вихідний список, змінюючи порядок елементів що містяться в ньому.
Розглянемо приклад:
# sort()
numbers = [5, 1, 10]
numbers.sort()
print(numbers) # [1, 5, 10]
# Оригінальний список змінено
# sorted()
numbers = [5, 1, 10]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 5, 10]
print(numbers) # [5, 1, 10]
# Оригінальний список залишається незмінним