Однією з привабливих особливостей мови Python є її лаконічність та легкість у використанні. Значною мірою це забезпечується наявністю великої кількості вбудованих функцій у стандартній бібліотеці. Однією з таких корисних функцій є `sorted()`, призначена для сортування елементів у різноманітних колекціях.
Без цієї функції розробникам доводилося б самостійно реалізовувати алгоритми сортування, такі як “бульбашкове сортування” або сортування вставками, що є досить трудомістким. Проте, Python пропонує набагато простіший та ефективніший спосіб, який і розглянемо далі.
Знайомство з функцією `sorted()`
Функція `sorted()` в Python спеціалізована для сортування ітерованих об’єктів. Ітерованим об’єктом може бути будь-яка послідовність, елементи якої можна перебрати у циклі. Це можуть бути рядки, списки, кортежі або множини. Зазвичай, ці елементи не мають певного порядку, і функція сортування дозволяє розташувати їхні значення у потрібній послідовності. Відсортування даних є корисним у багатьох аспектах:
- Пришвидшення пошуку: Пошук значень у відсортованій колекції стає набагато швидшим та ефективнішим, особливо при використанні алгоритмів, таких як двійковий пошук. Однак, двійковий пошук вимагає попереднього сортування даних.
- Зручність представлення даних: Користувачі часто хочуть бачити інформацію у впорядкованому вигляді, наприклад, за ціною (від найнижчої до найвищої), або за датою публікації (від найновішої). Для цього потрібно реалізувати певний спосіб сортування даних.
- Спрощення аналізу: При проведенні статистичного аналізу, наприклад, пошуку найчастішого значення у наборі даних, відсортовані дані значно полегшують роботу.
Інструкція з використання функції `sorted()`
Функція `sorted()` працює з будь-якими ітерованими об’єктами, як зазначалося раніше. На виході вона повертає відсортований список. Важливо запам’ятати: незалежно від типу вхідних даних, результатом завжди буде список.
Синтаксис функції `sorted()`
Сигнатура функції `sorted()` виглядає наступним чином:
sorted(iterable, key=None, reverse=False)
Як бачите, єдиним обов’язковим аргументом є `iterable`, тобто ітерований об’єкт, який потрібно відсортувати.
Наступний аргумент – `key`. Це функція, яка застосовується до кожного елемента в ітерованому об’єкті для отримання значення, що використовуватиметься для сортування. Це особливо корисно при сортуванні списків словників. Якщо `key` не вказано, то сортування відбувається без застосування додаткової функції.
Останній аргумент – `reverse`. Якщо встановити його значення в `True`, елементи будуть відсортовані у зворотному порядку.
У наступних розділах розглянемо приклади використання цієї функції на практиці.
Приклади застосування функції `sorted()`
Сортування списку чисел
Найпростішим випадком є сортування списку чисел. Розглянемо приклад коду:
# Список невідсортованих чисел numbers = [8, 4, 3, 9, 2, 0, 3] # Сортування списку sorted_numbers = sorted(numbers) # Виведення відсортованого списку print(sorted_numbers)
Результатом виконання буде:
[0, 2, 3, 3, 4, 8, 9]
Як бачимо, числа відсортовані за зростанням. Якщо потрібно відсортувати їх за спаданням, потрібно встановити для аргументу `reverse` значення `True`. Таким чином, рядок 4 у попередньому прикладі коду зміниться на:
sorted_numbers = sorted(numbers, reverse=True)
Результатом виконання зміненої програми буде:
[9, 8, 4, 3, 3, 2, 0]
Сортування списку рядків
Функція `sorted()` підтримує не лише числа, але й рядки. При сортуванні рядків у списку відбувається порівняння перших символів. Порівняння виконується на основі ASCII-кодів символів. Наприклад, “hello” буде стояти перед “world”, тому що ASCII-код “h” (104) менший за ASCII-код “w” (119).
Якщо кілька рядків мають однаковий перший символ, порівнюються їхні наступні символи доти, доки не буде визначено порядок. Ось приклад сортування імен:
# Список імен members_list = ['bob', 'dave', 'charlie', 'alice'] # Сортування імен sorted_members_list = sorted(members_list) # Виведення відсортованого списку print(sorted_members_list)
Результатом буде:
['alice', 'bob', 'charlie', 'dave']
Оскільки використовуються ASCII-коди, порядок рядків залежить від того, який символ з’являється першим у таблиці ASCII. Наприклад, символи верхнього регістру будуть стояти перед символами нижнього регістру, бо вони йдуть перед літерами нижнього регістру у таблиці ASCII. Ось повна таблиця ASCII для довідки:
Джерело: commons.wikimedia.org
Інші ітеровані об’єкти: рядки, кортежі та множини
Як згадувалось раніше, функція `sorted()` працює з різними видами ітерованих об’єктів. Принципи сортування залишаються незмінними. Розглянемо приклади:
# Виведення відсортованого рядка print(sorted("dijkstra")) # Виведення відсортованого кортежу print(sorted((3, 4, 2, 1, 5, 0))) # Виведення відсортованої множини print(sorted(set([4, 5, 5, 1, 3, 8, 9])))
Результатом цього буде:
['a', 'd', 'i', 'j', 'k', 'r', 's', 't'] [0, 1, 2, 3, 4, 5] [1, 3, 4, 5, 8, 9]
Як бачимо, результатом у кожному випадку є список.
Сортування списку словників
Ви також можете використовувати `sorted()` для сортування списку словників. Однак, сортування словників є дещо складнішим, оскільки, на відміну від чисел або рядків, словник має декілька властивостей, кожна з яких може бути використана для порівняння.
Тому, для сортування словників, потрібно вказати функцію, яка зведе весь словник до одного значення, що використовуватиметься для порівняння. Ця функція передається `sorted()` як аргумент `key`. Ось приклад:
people = [ { 'name': 'Alice', 'age': 27 }, { 'name': 'Bob', 'age': 23 }, { 'name': 'Charlie', 'age': 25} ] people_sorted_by_age = sorted(people, key=lambda person: person['age']) print(people_sorted_by_age)
У цьому прикладі ми маємо список з трьох людей, представлених словниками. Кожен словник має поля `name` (ім’я) та `age` (вік). Ми хочемо відсортувати людей за віком, тому передаємо лямбда-функцію, як аргумент `key`. Ця функція приймає словник особи і повертає її вік. Повернене значення використовується для сортування. Таким чином, весь словник зводиться до простого цілого числа для порівняння. Для зручності використано лямбда-функцію.
Виконання коду дасть наступний результат:
[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]
Використання аргументу `key`
Аргумент `key` не обов’язково використовувати тільки при сортуванні словників. Його можна використовувати з будь-якими значеннями. Його мета – визначення ключа, за яким буде виконуватися сортування. Ось приклади:
- Сортування рядків за довжиною. Для цього потрібно визначити функцію, яка повертає довжину кожного рядка.
- Сортування рядків у списку без врахування регістру. Кожен рядок можна перетворити на нижній регістр. Це досягається через створення ключової функції, яка приймає рядок і повертає його версію у нижньому регістрі.
- Сортування значень на основі комбінації значень інших полів.
Складність виконання функції `sorted()`
Функція `sorted()` має складність виконання O(n log n), де n – кількість елементів у вхідному ітерованому об’єкті. Це пов’язано з тим, що функція використовує алгоритм Timsort, гібридний алгоритм сортування, який ґрунтується на сортуванні злиттям і сортуванні вставками.
Просторова складність функції дорівнює O(n), де n – це кількість елементів на вході. Це пояснюється тим, що створюється і повертається новий список.
Функція `sorted()` проти функції `sort()`
Іншим способом сортування значень є функція `sort()`. У цьому розділі розглянемо основні відмінності між функціями `sorted()` та `sort()`.
- Функція `sort()` змінює вихідний список, тоді як функція `sorted()` створює новий список і повертає його.
- Оскільки `sort()` змінює список на місці, то вхідними даними повинен бути список. Натомість, `sorted()` може приймати будь-який ітерований об’єкт і створювати на його основі новий список.
Підсумки
У цій статті ми детально розглянули функцію `sorted()` – її призначення, спосіб використання, аргументи та приклади застосування. Ми також обговорили складність її виконання та порівняли її з функцією `sort()`. Сподіваємося, що ця інформація виявиться корисною для вас.
Далі ви можете прочитати нашу статтю про функцію `sum()` у Python.