Як сортувати списки в Python

У цій статті ви опануєте навички сортування списків у Python.

В Python існує можливість застосування методу sort() для безпосереднього сортування списку. Також можна скористатися вбудованою функцією sorted(), яка повертає відсортовану копію списку, залишаючи оригінал без змін.

У цьому довіднику ви ознайомитеся з:

  • Структурою методу sort() та функції sorted().
  • Прикладами програмного коду для сортування списків у порядку зростання та спадання.
  • Можливостями налаштування процесу сортування за допомогою параметра key.
  • Ключовими відмінностями між sort() і sorted().

Розпочнімо навчання!👩🏽‍💻

Структура методу sort() у Python

Метод sort() застосовується до об’єктів-списків у Python. Він модифікує список безпосередньо, сортуючи його елементи “на місці”.

Синтаксис методу sort() виглядає наступним чином:

<list>.sort(reverse = True | False, key = <func>)

Розглянемо структуру цього синтаксису детальніше:

  • <list> – це будь-який коректний об’єкт-список у Python.
  • reverse – це необов’язковий параметр, який може приймати значення True або False.
  • За замовчуванням reverse має значення False, що означає сортування списку за зростанням. Якщо встановити True, список сортуватиметься у порядку спадання.
  • key також є необов’язковим параметром, якому присвоюється значення <func>.
  • <func> може бути як вбудованою функцією, так і функцією, визначеною користувачем.

У наступному розділі ви почнете роботу з простими прикладами коду.

Сортування списку Python за зростанням

Розглянемо приклад списку чисел. Щоб відсортувати його у порядку зростання, потрібно викликати метод sort() для цього списку.

▶ Запустіть наступний код.

nums = [25,13,6,17,9]
nums.sort()
print(nums)

# Результат: [6, 9, 13, 17, 25]

Числовий список був відсортований за зростанням, при цьому вихідний список був модифікований. Це і є сортування “на місці”.

Сортування списку Python у порядку спадання

Для сортування списку у порядку спадання потрібно встановити значення True для параметра reverse, як показано нижче.

nums = [25,13,6,17,9]
nums.sort(reverse = True)
print(nums)

# Результат: [25, 17, 13, 9, 6]

Як бачите, тепер список відсортовано в порядку спадання.

Використання параметра key з методом sort()

У цьому розділі ми розглянемо, як використовувати параметр key для налаштування сортування.

Тут mod5() – це функція, яка приймає число x і повертає залишок від ділення числа x на 5.

def mod5(x):
  return x % 5 

Ми хочемо використовувати цю функцію в якості ключа сортування.

Тепер запустіть наступний код.

nums = [25,13,6,17,9]
nums.sort(key = mod5)
print(nums)

# Результат: [25, 6, 17, 13, 9]

Проаналізуйте виведені дані.

Зверніть увагу, що тепер сортування налаштовано на основі значення, яке повертає функція mod5, а не стандартним чином.

  • Число, яке дає найменший залишок при діленні на 5, стає першим.
  • Число з найбільшим залишком при діленні на 5 стає останнім елементом відсортованого списку.

Щоб впевнитися, що це дійсно так, виконайте наступний код.

nums = [25,13,6,17,9]

for num in nums:
  print(f"{num} залишає залишок {num%5} при діленні на 5")

# Результат
25 залишає залишок 0 при діленні на 5
13 залишає залишок 3 при діленні на 5
6 залишає залишок 1 при діленні на 5
17 залишає залишок 2 при діленні на 5
9 залишає залишок 4 при діленні на 5

25 ділиться на 5 без залишку, залишок дорівнює 0. Тому це перший елемент у відсортованому списку. 6 має залишок 1, тому це другий елемент і т.д. 9 має залишок 4 при діленні на 5, і це останній елемент у відсортованому списку.

Замість того, щоб визначати окрему функцію, можна скористатися лямбда-функціями. У Python лямбда-вирази є однорядковими анонімними функціями. lambda arguments: expression – повертає вираз, обчислений на основі аргументів.

Перепишемо попередній приклад сортування з використанням лямбда-виразу.

nums = [25,13,6,17,9]
nums.sort(key = lambda x:x%5)
print(nums)

# Результат: [25, 6, 17, 13, 9]

До цього моменту ви навчилися сортувати списки чисел. Розглянемо, як можна сортувати списки рядків у Python.

Сортування списку Python в алфавітному порядку

У цьому розділі ви навчитеся сортувати списки рядків на прикладах, натхненних історіями про Гаррі Поттера. ✨

У нашому прикладі students – це список студентів Хогвартсу. Ми хочемо відсортувати їх в алфавітному порядку імен.

При сортуванні списку рядків за замовчуванням застосовується алфавітний порядок.

students = ["Harry","Ron","Hermione","Draco","Cedric"]

Виведемо відсортований список, щоб перевірити результат сортування.

students.sort()
print(students)

# Результат
['Cedric','Draco', 'Harry', 'Hermione', 'Ron']

Сортування списку Python у зворотному алфавітному порядку

Щоб відсортувати список у зворотному алфавітному порядку, встановіть reverse = True, як показано у наступному фрагменті коду.

students.sort(reverse = True)
print(students)

# Результат
['Ron', 'Hermione', 'Harry', 'Draco', 'Cedric']

З результату видно, що список справді відсортовано у зворотному порядку.

Налаштування сортування за допомогою параметра key

У цьому розділі ми налаштуємо сортування з використанням додаткового параметра key.

Розглянемо наступний список, houses.

houses = [
            {1:"Draco","house":"Slytherin"},
            {2:"Harry","house":"Gryffindor"},
            {3:"Cedric","house":"Hufflepuff"}
         ]

Тут houses – це список словників. Кожен словник містить дві пари “ключ-значення”, одна з яких позначає імена студентів, а друга – гуртожиток, до якого вони належать.

Ми хочемо відсортувати цей список гуртожитків в алфавітному порядку назв гуртожитків.

Як ви вже могли здогадатися, нам потрібно встановити параметр key на значення гуртожитку конкретних студентів.

Щоб отримати гуртожиток кожного студента, можна визначити функцію returnHouse(), як показано нижче.

def returnHouse(student):
  return student['house']

Ця функція повертає назву гуртожитку, до якого належить конкретний студент.

Тепер ви можете викликати метод sort() для списку houses, як показано нижче.

houses.sort(key=returnHouse)

У вихідних даних нижче, зверніть увагу, як список відсортовано за гуртожитками, а не за іменами студентів. Тому ми бачимо Гриффіндор, Гафелпаф та Слизерин у алфавітному порядку.

print(houses)

# Результат
[{2: 'Harry', 'house': 'Gryffindor'}, 
{3: 'Cedric', 'house': 'Hufflepuff'}, 
{1: 'Draco', 'house': 'Slytherin'}]

Щоб належним чином визначити параметр key, можна також скористатися лямбда-функцією. Для кожного елемента списку ця функція повертає назву гуртожитку для цього елемента списку.

▶ Запустіть наступний код, щоб переконатися.

houses.sort(key=lambda student:student["house"])
print(houses)

# Результат
[{2: 'Harry', 'house': 'Gryffindor'}, 
{3: 'Cedric', 'house': 'Hufflepuff'}, 
{1: 'Draco', 'house': 'Slytherin'}]

У всіх наведених прикладах ви використовували метод sort() для списку. І тепер ви знаєте, що він змінює вихідний список.

А що робити, якщо ви хочете зберегти оригінальний список, але отримати відсортовану копію списку?

У Python для цього можна використовувати функцію sorted().

Структура функції sorted() у Python

Функція sorted() приймає список або будь-яку колекцію як аргумент. Вона повертає відсортовану копію списку, а вихідний список залишається без змін.

Синтаксис функції sorted() у Python виглядає так:

<sorted_copy> = sorted(<list>, reverse = True | False, key = <func>)

Зверніть увагу, що синтаксис дуже схожий на метод sort(), який ми розглядали раніше.

  • <list> – це будь-який коректний об’єкт-список у Python і є обов’язковим параметром.
  • reverse та key є необов’язковими параметрами.

Примітка: на відміну від методу sort(), який працює лише зі списками, функцію sorted() можна використовувати для сортування будь-якого ітерабельного об’єкту у Python, наприклад, списків, рядків і словників.

Сортування списку Python за допомогою функції sorted()

#1. У цьому прикладі nums – це список чисел.

Ви можете викликати функцію sorted() з nums як аргументом і призначити результат до списку sorted_nums1.

nums = [25,13,6,17,9]
sorted_nums1 = sorted(nums)
print(sorted_nums1)

# Результат: [6, 9, 13, 17, 25]

У вихідних даних вище видно, що список nums відсортовано за зростанням за замовчуванням.

Також зверніть увагу, що вихідний список nums не змінено, оскільки sorted() повертає новий список. Це продемонстровано нижче.

print(nums)
 # Результат: [25, 13, 6, 17, 9]

#2. Тепер встановіть додатковий параметр reverse на True і отримайте sorted_nums2.

Як показано в коді нижче, sorted_nums2 – це новий список з елементами, відсортованими в порядку спадання.

sorted_nums2 = sorted(nums,reverse = True)
print(sorted_nums2)

# Результат: [25, 17, 13, 9, 6]

#3. У цьому прикладі попрацюємо зі списком рядків.

Як і в попередніх прикладах, виклик функції sorted() повертає новий список. І елементи відсортовані в алфавітному порядку.

fruits = ['pears','strawberry','apple','pineapple','blueberry']
sorted_fr1 = sorted(fruits)
print(sorted_fr1)

# Результат:
['apple', 'blueberry', 'pears', 'pineapple', 'strawberry']

#4. Тепер налаштуємо сортування за допомогою додаткового параметра key. Встановіть key на len. Це відсортує список на основі довжини рядків.

Примітка: у Python вбудована функція len() приймає будь-який ітерабельний об’єкт, наприклад, списки, рядки, кортежі і т.д., та повертає довжину ітерабельного об’єкта.

Рядок з найкоротшою довжиною з’являється першим у відсортованому списку, а найдовший – в кінці відсортованого списку.

fruits = ['pear','strawberry','apple','pineapple','blueberry']
sorted_fr2 = sorted(fruits,key=len)
print(sorted_fr2)

# Результат:
['pear', 'apple', 'pineapple', 'blueberry', 'strawberry']

У вихідних даних вище pear – найкоротший рядок, а strawberry – найдовший.

Метод sort() Python проти функції sorted()

На даний момент ви навчилися використовувати метод sort() і функцію sorted(). У цьому розділі ми підсумуємо відмінності між цими двома способами.

Python .sort() Python sorted()
Сортує список безпосередньо – змінює оригінальний список. Повертає новий відсортований список.
Працює тільки зі списками Python. Працює з ітерабельними об’єктами Python, такими як списки, рядки та інші колекції.
Має тип повернення None. Повертає відсортовану копію ітерабельного об’єкта.

Підсумки 👩‍🏫

Сподіваємося, цей посібник зі списками Python був для вас корисним.

Давайте коротко підсумуємо те, що ми розглянули:

  • Використовуйте list.sort(reverse = True | False, key = <func>) з необов’язковими параметрами reverse і key для сортування списку “на місці”.
  • Використовуйте sorted(list, reverse = True | False, key = <func>), щоб отримати відсортовану копію списку.

Тепер, коли ви навчилися сортувати списки Python, дізнайтеся про генератори списків у Python. Або ви також можете навчитися обробляти файли або працювати з файлами JSON у Python.

Ви можете спробувати наведені вище приклади в онлайн-компіляторі Python techukraine.net.