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

Сортування даних – одне з найпоширеніших завдань під час роботи з Python. Наприклад, ви можете відсортувати список членів команди на ім'я або список проектів як пріоритет.

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

Sort() і sorted() в Python

У Python можна відсортувати список, використовуючи вбудований метод list.sort() або вбудовану функцію sorted().

Функція sorted() створює новий відсортований список, а метод list.sort() сортує список на місці. Якщо ви бажаєте зберегти, несортований список використовувати функцію sorted(). Інша відмінність полягає в тому, що функція sorted() працює з будь-яким об'єктом, що повторюється.

Синтаксис sort()і sorted()наступний:

list.sort(key=function, reverse=Boolean)
sorted(iterable, key=function, reverse=Boolean)

Необов'язкові ключові аргументи key та reverse мають таке значення:

  • key — функція, яка приймає один аргумент і перетворює його перед порівнянням. Функція повинна повертати одне значення, яке використовується для порівняння сортування.
  • reverse – Значення реверсу може бути або або, True або False. Значення за промовчанням є True. Коли для цього аргументу встановлено false, список сортується у зворотному порядку.

У цьому прикладі показано, як відсортувати список рядків в алфавітному порядку:

directions = ["north", "east", "south", "west"] directions.sort() print('Sorted list:', directions)
Sorted list: ['east', 'north', 'south', 'west']

Якщо потрібно зберегти вихідний список без змін, використовуйте функцію sorted():

directions = ["north", "east", "south", "west"] sorted_directions = sorted(directions) print('Sorted list:', sorted_directions)
Sorted list: ['east', 'north', 'south', 'west']

Щоб відсортувати список у зворотному (низхідному) порядку, встановіть аргумент reverse у True:

directions = ["north", "east", "south", "west"] directions.sort(reverse=True) print('Sorted list:', directions)
Sorted list: ['west', 'south', 'north', 'east']

Сортування з функцією

Аргумент key приймає функцію і дозволяє виконувати складніші операції сортування.

Найпростіший приклад – сортування елементів за довжиною:

directions = ["Destroyer", "Alex", "AndreyEx", "Max"] directions.sort(key=len) print('Sorted list:', directions)

Ми використовуємо функцію len(), щоб повернути кількість символів у рядку, який використовується як компаратор:

Sorted list: ['AndreyEx', 'Destroyer', 'Max', 'Alex']

Ви також можете створити функцію користувача і використовувати її як keyаргумента для порівняння. Ось приклад, який показує, як відсортувати список цілих чисел за сумою їх цифр:

def sum_digits(num): digits = [int(x) for x in str(num)] return sum(digits) numbers = [23, 77, 19, 310, 219] numbers.sort(reverse=True, key=sum_digits ) print('Sorted list:', numbers)
Sorted list: [77, 219, 19, 23, 310]

Іншим прикладом може бути використання ключового аргументу для сортування складного списку, такого як список кортежів:

numbers = [(3, 14), (1, 61), (2, 71)] numbers.sort(key=lambda k: k[0]) print('Sorted list:', numbers)

Ми використовуємо анонімну (лямбду) функцію, яка повертає перший елемент кортежу. Список сортований за значенням, повернутим функцією:

Sorted list: [(1, 61), (2, 71), (3, 14)]

Той самий підхід можна використовувати для сортування списку словників:

elements = [ , , , ] elements.sort(key=lambda k: k['name']) print('Sorted list:', elements)

Лямбда-функція повертає значення nameключа, яке використовується для порівняння:

Найкращий і швидший спосіб сортування складної функції – використовувати функції модуля «Оператор». Ось приклад:

from operator import itemgetter elements = [ , , , ] elements.sort(key=itemgetter('symbol')) print('Sorted list:', elements)

Функція itemgetter зчитує значення ключа symbol:

Висновок

Ми показали вам, як сортувати списки Python, використовуючи метод sort() і функцію sorted().

Якщо у вас є питання або відгуки, не соромтеся залишати коментарі.

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту та натисніть Ctrl+Enter.

Сортування списку у Python - Mriya.v.ua

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

Ілюстрація: Катя Павловська для Skillbox Media

Програміст, консультант, спеціаліст з документування. Легко та доступно розповідає про складні речі у програмуванні та дизайні.

Продовжуємо розбиратися в нюансах роботи з даними Python. Ми вже встигли поговорити про списки, словники, кортежі та безлічі — тепер розберемося, як діставати з них елементи в будь-якому зручному порядку. У цьому нам допоможуть функції сортування.

Сортування — це коли ми впорядковуємо елементи в об'єкті, що ітерується, за зростанням, спаданням або іншим критерієм. У Python є два способи сортування: за допомогою вбудованої функції sorted() та з використанням методу списків .sort(). Розглянемо їх докладніше.

Зміст

Валерій Ліньков

Експерт Skillbox з комп'ютерних мереж та кібербезпеки. Автор телеграм-каналу «Кудрявий мікрофон».

Основи сортування в Python

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

Синтаксис виглядає так:

sorted(iterable, key=None, reverse=False)
  • iterable – Обов'язковий. У нього передається об'єкт, що ітерується, який ви хочете відсортувати (список, кортеж, рядок, безліч, заморожене безліч).
  • key – Необов'язковий.Функція одного аргументу, яка буде застосована до кожного елемента (за умовчанням None).
  • reverse – Необов'язковий. За замовчуванням sorted() сортує об'єкт за зростанням — але якщо поставити reverse=True, можна розмістити елементи у зворотному порядку.

Відсортуємо список за допомогою функції sorted():

l = ['a', 'v', 'r', 'h', 'v', 'c', 'd', 'y', 'g', 'b'] print(sorted(l)) # Результат: # ['a', 'b', 'c', 'd', 'g', 'h', 'r', 'v', 'v', 'y'] print(l) # Результат: # ['a', 'v', 'r', 'h', 'v', 'c', 'd', 'y', 'g', 'b'] 

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

Символи Python сортуються за таблицею елементів ASCII: символ з меншим значенням ASCII буде поміщений раніше, ніж символ з великим значенням.

Для сортування елементів списку є метод списків .sort(). На відміну від функції sorted(), він змінює сам список, в якому він викликаний, і не повертає жодного значення (точніше, повертає None).

list.sort(key=None, reverse=False)

Замість list Необхідно вказати назву списку, до якого застосовується метод.

Параметри методу .sort() необов'язкові. Вони аналогічні параметрам sorted():

  • key — визначає невелику функцію, яка як аргумент приймає елемент списку. Для кожного елемента вона створює ключ порівняння – значення, за яким порівнюватимуть ці елементи (за замовчуванням – None).
  • reverse – Булевий аргумент, що приймає значення True або False. Якщо встановлено значення True, список сортується у зворотному порядку (за замовчуванням — False).

Розглянемо з прикладу, як працює метод .sort():

lst = ['a', 'v', 'r', 'h', 'v', 'c', 'd', 'y', 'g', 'b'] print(lst.sort()) # Результат: None print(lst) # Результат: # ['a', 'b', 'c', 'd', 'g', 'h', 'r', 'v', 'v', 'y'] 

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

Важливо: сортувати можна тільки ті об'єкти, що ітеруються, які містять однотипні елементи. Якщо у списку містяться елементи різних типів і між ними не визначено операцію порівняння, під час виконання .sort() або sorted() виникне виняток TypeError.

Приклади сортування різних об'єктів, що ітеруються.

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

s = sorted ('Hello, world!') print(s) # Результат виконання: # ['', '!', ',', 'H', 'd', 'e', ​​'l', 'l', 'l', 'o', 'o', 'r', ' w'] 

Ми отримали список символів, відсортованих як зростання значень ASCII.

Сортування кортежу. Так виглядатиме результат сортування кортежу, елементи якого числа:

s = sorted((7, 28, 4, 22, 6, 10, 7, 18)) print(s) # Результат виконання: # [4, 6, 7, 7, 10, 18, 22, 28] 

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

Сортування множини. Результат сортування множини, що складається з рядків:

s = sorted('attfgl', '#aghj', '1', '120', '3', '23', '1000', '4g', 'ehklgf', 'b', 'йц'>) print(s) # Результат виконання: # ['#aghj', '1', '1000', '120', '23', '3', '4g', 'attfgl', 'b', 'ehklgf', 'йц'] 

Результат — сортований список рядків.

Сортування словників. У Python словники – це невпорядковані структури даних. Вони мають швидкий доступ до елементів по ключу, але безпосереднє сортування елементів неможливе.

Якщо ми застосуємо функцію sorted() до словника, отримаємо відсортований список ключів коду у разі, коли ключі словника одного типу. Інакше виникне помилка TypeError.

original_dict = 'b': 1, 'a': 2, 'c': 3> sorted_items = sorted(original_dict) print(sorted_items) # Результат: ['a', 'b', 'c']

Сортувати словник можна за допомогою функції sorted() спільно з способом словника .items(). Цей метод повертає ключі та значення словника у вигляді набору кортежів.

original_dict = 'b': 1, 'a': 2, 'c': 3> # Сортування словника за ключами sorted_items = sorted(original_dict.items()) print(sorted_items) # [('a', 2), ('b', 1), ('c', 3)] # Перетворення назад на словник sorted_dict = dict(sorted_items) print(sorted_dict) #

Спочатку ми перетворимо набір кортежів original_dict.items() за допомогою функції sorted() у список, відсортований за ключами. Потім перетворимо список назад у словник за допомогою функції dict().

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

На напрямок сортування впливає необов'язковий параметр reverse. Якщо reverse=False (значення за замовчуванням), дані будуть сортуватися від більшого до меншого.

Числові дані. Сортуються за зростанням їх значень:

lst = [10, 8, 14, 0, 5, 4, 6, 29] lst.sort() print(lst) # Результат: # [0, 4, 5, 6, 8, 10, 14, 29] 

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

lst = ['10', '8', '14', '0', '5', '4', '6', '29'] lst.sort() print(lst) # Результат: # ['0', '10', '14', '29', '4', '5', '6', '8'] 

Це тому, що сортовані рядки порівнюються посимвольно, починаючи з першого символу. Якщо пара символів не дорівнює, тоді результатом порівняння рядків стає результат порівняння цієї пари, наприклад: ‘5’ > ’10’, а ’29’ < '6'.

Символьні дані. Сортуються в порядку зростання значень ASCII: символ із меншим значенням ASCII буде поміщений раніше, ніж символ із більшим значенням ASCII.

print(sorted(['a', 'v', 'r', 'A', 'd', 'g', 'b', '0', '2', '#', '%', 'ж', 'й'])) # Результат сортування: # ['#', '%', '0', '2', 'A', 'a', 'b', 'd', 'g', 'r', 'v', 'ж', 'й'] 

Великі та маленькі літери вважаються різними символами (коди ASCII для 'A' і 'a' різні, причому код 'A' менше, ніж код 'a').

Символи, відмінні від літер (наприклад, пробіли, знаки пунктуації, символи табуляції) також мають коди ASCII і беруть участь у сортуванні.

Бульові значення. False йде перед True, тому що їх чисельні еквіваленти – 0 і 1 відповідно.

booleans = [True, False, True, False, True] print(sorted(booleans)) # Результат: [False, False, True, True, True] 

Сортування за зменшенням

Якщо параметр reverse = False, то сортування йде у зворотному порядку – за зменшенням елементів:

l = ['a', 'v', 'r', 'h', 'v', 'c', 'd', 'y', 'g', 'b'] print(sorted(l, reverse = True)) # Результат: # ['y', 'v', 'v', 'r', 'h', 'g', 'd', 'c', 'b', 'a'] l.sort(reverse = True) print(l) # Результат той самий: #['y', 'v', 'v', 'r', 'h', 'g', 'd', 'c', 'b', 'a'] 

Сортування за ключем

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

Принцип роботи такий: кожному елементу у списку застосовується якась функція, та був результати цих функцій порівнюються визначення порядку елементів.

Розберемо кілька прикладів.

Сортування за довжиною. Якщо потрібно відсортувати список рядків у порядку зростання довжини рядка, як ключ сортування використовуємо функцію len.

words = ['cat', 'hamster', 'squirrel', 'rabbit'] sorted_words = sorted(words, key=len) print(sorted_words) # Результат: # ['cat', 'rabbit', 'hamster', 'squirrel'] 

Слово 'cat' — перше у списку, бо воно найкоротше, а 'squirrel' — останнє, бо воно найдовше.

Сортування за допомогою власної функції. Наприклад, можна створити функцію, яка повертає останній символ рядка, і використовувати її як ключ сортування.

def last_char(s): return s[-1] words = ['cat', 'hamster', 'squirrel', 'rabbit'] sorted_words = sorted(words, key=last_char) print(sorted_words) # Результат: ['squirrel', 'hamster', 'cat', 'rabbit'] 

Код порівнює останні символи рядків і сортує список їх зростання.

Сортування за допомогою лямбди-функції. lambda Python — це анонімна функція, яка приймає будь-яку кількість аргументів, але має лише один вираз, який виконується і повертає результат. Як ключ сортування використовується функція з одним аргументом.

Ключ сортування особливо корисний, коли потрібно сортувати складні структури даних — наприклад, списки словників.

people = [ 'name': 'Helen', 'age': 24>, 'name': 'John', 'age': 21>, 'name': 'Sam', 'age': 19> ] sorted_people = sorted(people, key=lambda p: p['age']) print(sorted_people) # Результат: [, , ] 

У цьому прикладі ми використовуємо лямбда-функцію lambda p: p['age']яка повертає вік кожної людини, і таким чином сортуємо записи про людей у ​​порядку збільшення їхнього віку.

Сортування із вбудованими функціями. У Python є вбудовані функції, які можна використовувати як ключі. Наприклад, функцію abs можна використовувати для сортування чисел за їх реальним, а за абсолютним значенням. Абсолютне значення – це його величина без урахування знака. Наприклад, абсолютне значення числа 5 дорівнює 5, а абсолютне значення числа -3 дорівнює 3.

numbers = [1, -2, 3, -4, -5] sorted_numbers = sorted(numbers, key=abs) print(sorted_numbers) # Результат: [1, -2, 3, -4, -5]

Стабільність сортування

Сортування за Python за умовчанням є стабільним. Це стосується й функції sorted(), і до методу .sort().

Стабільність означає, що коли два елементи мають однакові ключі сортування, їх відносний порядок зберігається. Це важливо при послідовному сортуванні — наприклад, якщо у нас є список, що включає елементи з двома і більше полями. Якщо ми спочатку відсортуємо список другого поля, а потім першого, то порядок сортування по другому полю збережеться.

color = [('green', 3), ('red', 1), ('blue', 2), ('green', 1), ('red', 2), ('blue', 1), ('green', 2)] sorted_color = sorted(color, key=lambda x: x[1]) # Сортуємо за другим ключем print(sorted_color) # Результат: [('red', 1), ('green', 1), ('blue', 1), ('blue', 2), ('red', 2), ('green', 2 ), ('green', 3)] sorted_color = sorted(sorted_color, key=lambda x: x[0]) # Сортуємо за першим ключем print(sorted_color) # Результат: [('blue', 1), ('blue', 2), ('green', 1), ('green', 2), ('green', 3), ('red', 1 ), ('red', 2)] 

Спочатку ми сортуємо список кортежів за другим елементом (номером) у порядку зростання – від 1 до 3. Потім сортуємо за першим ключем – color.

Оскільки 'blue' менше, ніж 'green' і 'red', всі кортежі 'blue' стоять першими, потім йдуть кортежі 'green', а після – 'red'. Але всередині кожної групи кортежів з однаковим першим елементом порядок залишився таким самим, як після першого сортування (за номером). Це свідчить про стабільність сортування.

Резюме

  • Будь-які об'єкти, що ітеруються в Python, можна сортувати за допомогою функції sorted(), а списки – за допомогою методу .sort(). Функція sorted() повертає відсортований список, що складається з елементів об'єкта, що ітерується, а сам об'єкт не змінюється. Метод списку .sort() змінює список.
  • За умовчанням сортування відбувається у порядку зростання, але можна провести і у зворотному — за допомогою аргументу reverse, якому потрібно передати значення True.
  • Щоб визначити власні критерії сортування, можна використовувати ключ сортування.
  • Різні структури даних вимагають різних методів сортування, тому завжди варто заздалегідь обміркувати, які дані сортувати і яким методом. Працюючи з великим обсягом даних слід враховувати, що одні методи можуть бути ефективнішими, ніж інші.
  • Наприклад, якщо потрібно лише відсортувати список, не зберігаючи його оригінального значення, то краще використовувати метод .sort() – це заощадить пам'ять. Якщо при сортуванні потрібно зберегти вихідний об'єкт, то використовується функція sorted().

Більше цікавого про код — у нашому телеграм-каналі. Підписуйтесь!