Оригінальна публікація: Python .sort() – How to Sort a List in Python

У цій статті ви дізнаєтесь, як використовувати метод списку sort() у Python.

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

Ви знатимете основи сортування списку в Python і як налаштувати сортування відповідно до своїх потреб.

Що ми розглянемо:

  1. Синтаксис методу sort.
  2. Сортування елементів списку в порядку зростання.
  3. Сортування елементів списку в порядку спадання.
  4. Сортування елементів списку за допомогою аргументу key.
  5. Різниця між 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».

Ви почнете з основ. Навчання побудоване в інтерактивний спосіб, дружній до початківців. У кінці ви створите п’ять проєктів, щоб попрактикуватись і закріпити вивчене.

Дякую, що прочитали. Щасливого програмування!