Оригінальна публікація: Python .sort() – How to Sort a List in Python
У цій статті ви дізнаєтесь, як використовувати метод списку sort()
у Python.
Ви також дізнаєтесь про інший спосіб сортування в Python за допомогою функції sorted()
, щоб зрозуміти, чим вона відрізняється від sort()
.
Ви знатимете основи сортування списку в Python і як налаштувати сортування відповідно до своїх потреб.
Що ми розглянемо:
- Синтаксис методу
sort
. - Сортування елементів списку в порядку зростання.
- Сортування елементів списку в порядку спадання.
- Сортування елементів списку за допомогою аргументу
key
. - Різниця між
sort()
таsorted()
.
5.1. Коли використовуватиsort()
таsorted()
.
Метод sort(). Огляд синтаксису
Метод sort()
— один зі способів, за допомогою якого можна відсортувати список у Python.
При використанні sort()
список сортується на місці. Це означає, що початковий список безпосередньо змінюється. Зокрема, змінюється початковий порядок елементів.
Загальний синтаксис методу sort()
виглядає так:
назва_списку.sort(reverse=..., key=... )
Розглянемо деталі:
назва_списку
— назва списку, з яким ви працюєте;sort()
— один з методів списку Python для сортування та зміни списку. Він сортує елементи списку або в порядку зростання, або в порядку спадання;sort()
приймає два необов’язкові параметри;reverse
— перший необов’язковий параметр. Він визначає, як буде відсортований список: в порядку зростання чи спадання. Приймає логічне значення (тобто True або False). Значення за замовчуванням — False, тобто список сортується в порядку зростання. Якщо встановити його значення на True, то список сортується навпаки: у порядку спадання;key
— другий необов’язковий параметр. Він приймає функцію або метод, які використовуються для визначення будь-яких можливих детальних критеріїв сортування.
Метод sort()
повертає None
(тобто повернутого значення немає), оскільки він просто змінює початковий список. Він не повертає новий список.
Як відсортувати елементи списку в порядку зростання за допомогою методу sort()
Як вже згадувалося раніше, sort()
сортує елементи списку в порядку зростання за замовчуванням.
Це означає, що елементи розташовуються від найменшого до найбільшого значення.
Найменше значення знаходиться зліва, а найбільше — справа.
Загальний синтаксис виглядає приблизно так:
назва_списку.sort()
Розглянемо приклад, де відсортуємо список цілих чисел:
# список чисел
мої_числа = [10, 8, 3, 22, 33, 7, 11, 100, 54]
# відсортуємо список на місці у порядку зростання
мої_числа.sort()
# надрукуємо змінений список
print(мої_числа)
# вихідні дані
# [3, 7, 8, 10, 11, 22, 33, 54, 100]
У прикладі вище числа сортуються від найменшого до найбільшого.
Так само можна зробити зі списком рядків:
# список рядків
мови_програмування = ["Python", "Swift", "Java", "C++", "Go", "Rust"]
# відсортуємо список на місці в алфавітному порядку
мови_програмування.sort()
# надрукуємо змінений список
print(мови_програмування)
# вихідні дані
# ['C++', 'Go', 'Java', 'Python', 'Rust', 'Swift']
У цьому випадку кожен рядок, що міститься у списку, був відсортований в алфавітному порядку.
Як ви побачили в обох прикладах, початкові списки були змінені.
Як відсортувати елементи списку в порядку спадання за допомогою методу `sort()`
Порядок спадання протилежний порядку зростання: елементи розташовуються від найбільшого до найменшого значення.
Щоб відсортувати елементи списку в порядку спадання, потрібно використати необов’язковий параметр reverse
з методом sort()
, і встановити значення True
.
Ось так виглядає загальний синтаксис:
назва_списку.sort(reverse=True)
Використаємо приклад з попереднього розділу, але цього разу зробимо так, щоб числа були відсортовані в зворотному порядку:
# список чисел
мої_числа = [10, 8, 3, 22, 33, 7, 11, 100, 54]
# відсортуємо список на місці в порядку спадання
мої_числа.sort(reverse=True)
# надрукуємо змінений список
print(мої_числа)
# вихідні дані
# [100, 54, 33, 22, 11, 10, 8, 7, 3]
Тепер всі числа розташовані у зворотному порядку; найбільше значення зліва, а найменше — справа.
Так само можна зробити зі списком рядків.
# список рядків
мови_програмування = ["Python", "Swift", "Java", "C++", "Go", "Rust"]
# відсортуємо список на місці у зворотному алфавітному порядку
мови_програмування.sort(reverse=True)
# надрукуємо змінений список
print(мови_програмування)
# вихідні дані
# ['Swift', 'Rust', 'Python', 'Java', 'Go', 'C++']
Тепер елементи списку розташовані у зворотному алфавітному порядку.
Як відсортувати елементи списку за допомогою параметра key з методом sort()
Ви можете використати параметр key
, щоб виконати конкретніші операції сортування.
Значення, призначене параметру key
, має щось викликати.
Наприклад, можна викликати методи та функції.
Цей метод або функція, призначена до key
, буде застосована до всіх елементів у списку перед будь-яким сортуванням і визначатиме логіку для критеріїв сортування.
Припустимо, ви хочете відсортувати список рядків на основі їхньої довжини.
Для цього потрібно призначити вбудовану функцію len()
до параметру key
.
Функція len()
вирахує довжину кожного елемента в списку, підрахувавши символи, які містяться в цьому елементі.
мови_програмування = ["Python", "Swift", "Java", "C++", "Go", "Rust"]
мови_програмування.sort(key=len)
print(мови_програмування)
# вихідні дані
# ['Go', 'C++', 'Java', 'Rust', 'Swift', 'Python']
У наведеному вище прикладі рядки сортуються у порядку зростання за замовчуванням, але цього разу сортування відбувається на основі їхньої довжини.
Найкоротший рядок знаходиться зліва, а найдовший — справа.
Параметри key
та reverse
також можна комбінувати.
Наприклад, елементи списку можна відсортувати на основі їхньої довжини, але у порядку спадання.
мови_програмування = ["Python", "Swift", "Java", "C++", "Go", "Rust"]
мови_програмування.sort(key=len, reverse=True)
print(мови_програмування)
# вихідні дані
# ['Python', 'Swift', 'Java', 'Rust', 'C++', 'Go']
У наведеному вище прикладі рядки відсортовано від найдовшого до найкоротшого.
Варто зазначити, що ви можете створити власну функцію сортування, щоб надати конкретніші критерії сортування.
Наприклад, ви можете створити певну функцію, а потім відсортувати список відповідно до значення, яке вона повертає.
Припустимо, у вас є список словників з мовами програмування та роком створення кожної мови.
мови_програмування = [{'мова':'Python','рік':1991},
{'мова':'Swift','рік':2014},
{'мова':'Java', 'рік':1995},
{'мова':'C++','рік':1985},
{'мова':'Go','рік':2007},
{'мова':'Rust','рік':2010},
]
Ви можете визначити власну функцію, яка отримує значення певного ключа зі словника.
💡 Майте на увазі, що ключ словника і параметр key
, який приймає sort()
, — це дві різні речі!
Зокрема, функція отримає і поверне значення ключа рік
у списку словників, що вказує рік, коли кожна мова була створена.
Повернене значення потім буде застосовано як критерій сортування списку.
мови_програмування = [{'мова':'Python','рік':1991},
{'мова':'Swift','рік':2014},
{'мова':'Java', 'рік':1995},
{'мова':'C++','рік':1985},
{'мова':'Go','рік':2007},
{'мова':'Rust','рік':2010},
]
def get_рік(element):
return element['рік']
Потім ви можете виконати сортування відповідно до значення, яке повертає функція, призначивши його до параметру key
, і відсортувати список за хронологічним порядком за замовчуванням:
мови_програмування = [{'мова':'Python','рік':1991},
{'мова':'Swift','рік':2014},
{'мова':'Java', 'рік':1995},
{'мова':'C++','рік':1985},
{'мова':'Go','рік':2007},
{'мова':'Rust','рік':2010},
]
def get_рік(element):
return element['рік']
мови_програмування.sort(key=get_рік)
print(мови_програмування)
Вихідні дані:
[{'мова': 'C++', 'рік': 1985}, {'мова': 'Python', 'рік': 1991}, {'мова': 'Java', 'рік': 1995}, {'мова': 'Go', 'рік': 2007}, {'мова': 'Rust', 'рік': 2010}, {'мова': 'Swift', 'рік': 2014}]
Якщо ви хочете відсортувати список від найновішої мови до найстарішої, або інакше кажучи у порядку спадання, тоді використайте параметр reverse=True
:
мови_програмування = [{'мова':'Python','рік':1991},
{'мова':'Swift','рік':2014},
{'мова':'Java', 'рік':1995},
{'мова':'C++','рік':1985},
{'мова':'Go','рік':2007},
{'мова':'Rust','рік':2010},
]
def get_рік(element):
return element['рік']
мови_програмування.sort(key=get_рік, reverse=True)
print(мови_програмування)
Вихідні дані:
[{'мова': 'Swift', 'рік': 2014}, {'мова': 'Rust', 'рік': 2010}, {'мова': 'Go', 'рік': 2007}, {'мова': 'Java', 'рік': 1995}, {'мова': 'Python', 'рік': 1991}, {'мова': 'C++', 'рік': 1985}]
Щоб досягти точно такого ж результату, ви можете створити lambda-функцію.
Замість використання регулярної власної функції, визначеної за допомогою ключового слова def
, ви можете:
- створити короткий вираз в одному рядку;
- і не визначати назву функції, як це було зроблено з функцією
def
. Lambda-функції також називаються анонімними функціями.
мови_програмування = [{'мова':'Python','рік':1991},
{'мова':'Swift','рік':2014},
{'мова':'Java', 'рік':1995},
{'мова':'C++','рік':1985},
{'мова':'Go','рік':2007},
{'мова':'Rust','рік':2010},
]
мови_програмування.sort(key=lambda element: element['рік'])
print(мови_програмування)
Lambda-функція, яка визначається рядком key=lambda element: element['рік']
, відсортує ці мови програмування від найстарішої до найновішої.
Різниця між sort() та sorted()
Метод sort()
працює аналогічно до функції sorted()
.
Загальний синтаксис функції sorted()
виглядає так:
sorted(назва_списку,reverse=...,key=...)
Розберемо детальніше:
sorted()
— вбудована функція, яка приймає ітерабельний об’єкт. Потім вона сортує його у порядку зростання або спадання;sorted()
приймає три параметри. Один параметр є обов’язковим, а два інші — необов’язкові;назва_списку
— обов’язковий параметр. У цьому випадку параметром є список, алеsorted()
також приймає будь-який інший ітерабельний об’єкт;sorted()
також приймає необов’язкові параметриreverse
таkey
, які є такими ж необов’язковими параметрами, як і методsort()
.
Головна різниця між sort()
та sorted()
полягає в тому, що функція sorted()
приймає список і повертає нову відсортовану копію цього списку.
Нова копія містить елементи вихідного списку у відсортованому порядку.
Елементи у вихідному списку не змінюються і залишаються такими, як є.
Отже, підсумовуючи:
- метод
sort()
не має поверненого значення і безпосередньо змінює вихідний список, змінюючи порядок елементів у ньому; - з іншого боку, функція
sorted()
має повернене значення, яке є відсортованою копією вихідного списку. Ця копія містить елементи вихідного списку у відсортованому порядку. Крім того, вихідний список залишається незмінним.
Давайте розглянемо приклад, щоб побачити, як це працює:
# вихідний список чисел
мої_числа = [10, 8, 3, 22, 33, 7, 11, 100, 54]
# відсортуємо вихідний список у стандартному порядку зростання
мої_числа_відсортовано = sorted(мої_числа)
# надрукуємо вихідний список
print(мої_числа)
# надрукуємо копію вихідного списку, яка була створена
print(мої_числа_відсортовано)
# вихідні дані
# [10, 8, 3, 22, 33, 7, 11, 100, 54]
# [3, 7, 8, 10, 11, 22, 33, 54, 100]
Оскільки до sorted()
не було надано додаткових аргументів, вона упорядкувала копію вихідного списку у стандартному порядку зростання — від найменшого значення до найбільшого.
При друку вихідного списку ви бачите, що він залишився таким самим, а елементи розташовані в початковому порядку.
Як ви бачили у прикладі вище, копія списку була присвоєна до нової змінної мої_числа_відсортовано
.
Подібне не можна зробити з sort()
.
Розглянемо ще один приклад, щоб побачити, що станеться, якщо спробувати використати метод sort()
.
мої_числа = [10, 8, 3, 22, 33, 7, 11, 100, 54]
мої_числа_відсортовано = мої_числа.sort()
print(мої_числа)
print(мої_числа_відсортовано)
# вихідні дані
# [3, 7, 8, 10, 11, 22, 33, 54, 100]
# None
Як бачите, sort()
повертає значення None
.
Ще одна річ, яку варто зазначити: параметри reverse
та key
, які приймає функція sorted()
, працюють точно так само, як і метод sort()
з попередніх розділів.
Коли використовувати sort() та sorted()
Нижче перераховано речі, на які потрібно звернути увагу, вирішуючи, що варто використовувати: sort()
чи sorted()
.
По-перше, врахуйте тип даних, з якими працюєте:
- якщо ви працюєте виключно зі списком з самого початку, то вам потрібно використовувати метод
sort()
, оскількиsort()
викликається тільки для списків; - якщо ви хочете більшої гнучкості і поки не працюєте зі списком, то можете використовувати
sorted()
. Функціяsorted()
приймає і сортує будь-який ітерабельний об’єкт (словники, кортежі та множини), а не лише списки.
Потім потрібно врахувати, чи для вас важливо зберегти початковий порядок списку, з яким працюєте:
- при виклику
sort()
буде змінено вихідний список, а початковий порядок буде втрачено. Ви не зможете відновити початкові позиції елементів списку. Використовуйтеsort()
, коли ви точно впевнені, що хочете змінити список, з яким працюєте, і впевнені, що не хочете зберігати попередній порядок; - з іншого боку, функція
sorted()
корисна, якщо ви хочете створити новий список, але потрібно залишити той список, з яким працюєте. Функціяsorted()
створить новий відсортований список, елементи якого впорядковані у бажаному порядку.
Наостанок врахуйте ефективність у часі й пам’яті:
- метод
sort()
займає й споживає менше пам’яті, оскільки він просто сортує список на місці й не створює зайвий новий список, який вам не потрібний. З цієї ж причини він трохи швидший, оскільки не створює копію. Це може бути корисно, якщо ви працюєте з великими списками, які містять більше елементів.
Висновок
Це все! Тепер ви знаєте, як відсортувати список у Python за допомогою методу sort()
.
Ми також розглянули ключові відмінності між сортуванням списку за допомогою sort()
та sorted()
.
Сподіваюсь, ця стаття була корисною.
Щоб дізнатися більше про мову програмування Python, ознайомтеся з безоплатною сертифікацією freeCodeCamp «Наукові обчислення з Python».
Ви почнете з основ. Навчання побудоване в інтерактивний спосіб, дружній до початківців. У кінці ви створите п’ять проєктів, щоб попрактикуватись і закріпити вивчене.
Дякую, що прочитали. Щасливого програмування!