Сортування даних – одне з найпоширеніших завдань під час роботи з 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.
Як побудувати елементи списків, множин, рядків, кортежів.
Ілюстрація: Катя Павловська для 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().
Більше цікавого про код — у нашому телеграм-каналі. Підписуйтесь!