Розуміння відсортованої функції в Python: простий посібник

Однією з привабливих особливостей мови 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.