Сортировка списков и словарей с sorted, key

Сортировка — одна из ключевых операций при работе с данными. В Python для этого предназначена встроенная функция sorted(), которая позволяет сортировать любые итерируемые объекты, такие как списки и словари. Ещё одна мощная возможность заключается в параметре key, который позволяет задавать, как именно будут сравниваться элементы во время сортировки. В этой лекции мы рассмотрим, как использовать sorted() и параметр key, а также как эффективно применять анонимные функции lambda для гибкой сортировки данных.

Функция sorted()

Функция sorted() возвращает новый отсортированный список, оставляя исходные данные неизменными.

numbers = [4, 2, 9, 1, 7]
sorted_numbers = sorted(numbers)
print(sorted_numbers)

Вывод:

[1, 2, 4, 7, 9]

Пояснение:

В этом примере мы сортируем список numbers, содержащий целые числа. Функция sorted() возвращает новый список, где элементы упорядочены по возрастанию.

 

Параметр reverse

Чтобы отсортировать данные в обратном порядке, можно использовать параметр reverse=True.

numbers = [4, 2, 9, 1, 7]
sorted_numbers = sorted(numbers, reverse=True)
print(sorted_numbers)

Вывод:

[9, 7, 4, 2, 1]

Пояснение:

Параметр reverse=True говорит функции sorted(), что нужно сортировать элементы по убыванию.

Параметр key

Одной из самых полезных возможностей функции sorted() является параметр key. Он позволяет передать функцию, которая будет применена к каждому элементу перед сравнением. Это особенно полезно, если нам нужно сортировать по определённому критерию.


Пример 1: Сортировка строк по длине

words = ["apple", "banana", "kiwi", "strawberry"]
sorted_words = sorted(words, key=len)
print(sorted_words)

Вывод:

['kiwi', 'apple', 'banana', 'strawberry']

Пояснение:

Здесь мы используем встроенную функцию len в качестве key. Она возвращает длину строки, поэтому элементы сортируются по количеству символов в словах.


Пример 2: Сортировка по последней букве

words = ["apple", "banana", "kiwi", "strawberry"]
sorted_words = sorted(words, key=lambda word: word[-1])
print(sorted_words)

Вывод:

['banana', 'apple', 'kiwi', 'strawberry']

Пояснение:

Мы применяем lambda для создания анонимной функции, которая принимает строку и возвращает её последний символ. Это позволяет сортировать слова по последней букве.

Использование lambda для сортировки

Функции lambda идеально подходят для случаев, когда требуется кратковременная функция для параметра key. Они могут быть использованы для сложных критериев сортировки, когда стандартных функций недостаточно.


Пример 3: Сортировка списка кортежей по второму элементу

data = [(1, 4), (3, 2), (5, 1), (2, 3)]
sorted_data = sorted(data, key=lambda x: x[1])
print(sorted_data)

Вывод:

[(5, 1), (3, 2), (2, 3), (1, 4)]

Пояснение:

Каждый элемент в списке — это кортеж. Мы используем lambda, чтобы сортировать список по второму элементу каждого кортежа. Функция lambda x: x[1] берёт второй элемент кортежа x и использует его для сравнения.


Пример 4: Сортировка по длине строки и первой букве

Иногда нужно комбинировать несколько критериев сортировки. Для этого можно возвращать несколько значений в lambda.

words = ["apple", "banana", "kiwi", "strawberry"]
sorted_words = sorted(words, key=lambda word: (len(word), word[0]))
print(sorted_words)

Вывод:

['kiwi', 'apple', 'banana', 'strawberry']

Пояснение:

Мы сортируем сначала по длине строки, а затем по первой букве. Если два элемента имеют одинаковую длину, то сравнение идёт по алфавиту.

 

Сортировка словарей

Функция sorted() также может быть применена для сортировки словарей. Поскольку словари являются неупорядоченными коллекциями пар ключ-значение, сортировка может осуществляться либо по ключам, либо по значениям.


Пример 5: Сортировка словаря по ключам

dictionary = {'apple': 5, 'banana': 3, 'kiwi': 10, 'strawberry': 2}
sorted_keys = sorted(dictionary)
print(sorted_keys)

Вывод:

['apple', 'banana', 'kiwi', 'strawberry']

Пояснение:

По умолчанию sorted() сортирует ключи словаря в алфавитном порядке.


Пример 6: Сортировка словаря по значениям

dictionary = {'apple': 5, 'banana': 3, 'kiwi': 10, 'strawberry': 2}
sorted_items = sorted(dictionary.items(), key=lambda item: item[1])
print(sorted_items)

Вывод:

[('strawberry', 2), ('banana', 3), ('apple', 5), ('kiwi', 10)]

Пояснение:

Мы сортируем список пар ключ-значение, используя lambda, которая берёт второй элемент пары (значение) для сравнения.

 

Использование функции sorted() с вложенными структурами


Пример 7: Сортировка списка словарей

students = [
    {'name': 'John', 'age': 20},
    {'name': 'Alice', 'age': 22},
    {'name': 'Bob', 'age': 19}
]
sorted_students = sorted(students, key=lambda student: student['age'])
print(sorted_students)

Вывод:

[{'name': 'Bob', 'age': 19}, {'name': 'John', 'age': 20}, {'name': 'Alice', 'age': 22}]

Пояснение:

Мы сортируем список словарей по значению ключа 'age'. Функция lambda берёт возраст каждого студента для сравнения.

 

Пример комбинированной сортировки с использованием lambda


Пример 8: Сортировка по нескольким критериям в списке словарей

students = [
    {'name': 'John', 'age': 20, 'grade': 'B'},
    {'name': 'Alice', 'age': 22, 'grade': 'A'},
    {'name': 'Bob', 'age': 19, 'grade': 'C'}
]
sorted_students = sorted(students, key=lambda student: (student['grade'], student['age']))
print(sorted_students)

Вывод:

[{'name': 'Alice', 'age': 22, 'grade': 'A'}, {'name': 'John', 'age': 20, 'grade': 'B'}, {'name': 'Bob', 'age': 19, 'grade': 'C'}]

Пояснение:

Мы сортируем студентов по двум критериям: сначала по оценке 'grade', а затем по возрасту 'age', если оценки одинаковые. Функция lambda возвращает кортеж, который содержит два значения, используемые для сравнения.

 

Вот таблица, которая описывает использование функции sorted() в Python, включая примеры использования параметров reverse, key, и работы с вложенными структурами данных:

РазделОписаниеПримерВывод
Функция sorted()Возвращает новый отсортированный список, оставляя исходные данные неизменными.numbers = [4, 2, 9, 1, 7] 
sorted_numbers = sorted(numbers) 
print(sorted_numbers)
[1, 2, 4, 7, 9]
Параметр reverseИспользуется для сортировки в обратном порядке.numbers = [4, 2, 9, 1, 7] 
sorted_numbers = sorted(numbers, reverse=True) 
print(sorted_numbers)
[9, 7, 4, 2, 1]
Параметр keyПозволяет передать функцию, которая будет применена к каждому элементу перед сравнением.  
Пример 1: Сортировка строк по длинеСортировка строк по их длине.words = ["apple", "banana", "kiwi", "strawberry"] 
sorted_words = sorted(words, key=len) 
print(sorted_words)
['kiwi', 'apple', 'banana', 'strawberry']
Пример 2: Сортировка по последней буквеСортировка строк по последней букве.words = ["apple", "banana", "kiwi", "strawberry"] 
sorted_words = sorted(words, key=lambda word: word[-1]) 
print(sorted_words)
['banana', 'apple', 'kiwi', 'strawberry']
Пример 3: Сортировка по второму элементуСортировка списка кортежей по второму элементу каждого кортежа.data = [(1, 4), (3, 2), (5, 1), (2, 3)] 
sorted_data = sorted(data, key=lambda x: x[1]) 
print(sorted_data)
[(5, 1), (3, 2), (2, 3), (1, 4)]
Пример 4: Сортировка по длине и первой буквеКомбинированная сортировка по длине строки и первой букве.words = ["apple", "banana", "kiwi", "strawberry"] 
sorted_words = sorted(words, key=lambda word: (len(word), word[0])) 
print(sorted_words)
['kiwi', 'apple', 'banana', 'strawberry']
Сортировка словарейСортировка словарей по ключам или значениям.  
Пример 5: Сортировка по ключамСортировка словаря по ключам в алфавитном порядке.dictionary = {'apple': 5, 'banana': 3, 'kiwi': 10, 'strawberry': 2} 
sorted_keys = sorted(dictionary) 
print(sorted_keys)
['apple', 'banana', 'kiwi', 'strawberry']
Пример 6: Сортировка по значениямСортировка словаря по значениям.dictionary = {'apple': 5, 'banana': 3, 'kiwi': 10, 'strawberry': 2} 
sorted_items = sorted(dictionary.items(), key=lambda item: item[1]) 
print(sorted_items)
[('strawberry', 2), ('banana', 3), ('apple', 5), ('kiwi', 10)]
Использование функции sorted() с вложенными структурамиСортировка вложенных структур данных, таких как списки словарей.  
Пример 7: Сортировка списка словарейСортировка списка словарей по значению ключа 'age'.students = [{'name': 'John', 'age': 20}, {'name': 'Alice', 'age': 22}, {'name': 'Bob', 'age': 19}] 
sorted_students = sorted(students, key=lambda student: student['age']) 
print(sorted_students)
[{'name': 'Bob', 'age': 19}, {'name': 'John', 'age': 20}, {'name': 'Alice', 'age': 22}]
Пример 8: Комбинированная сортировкаСортировка списка словарей по нескольким критериям: сначала по 'grade', затем по 'age'.students = [{'name': 'John', 'age': 20, 'grade': 'B'}, {'name': 'Alice', 'age': 22, 'grade': 'A'}, {'name': 'Bob', 'age': 19, 'grade': 'C'}] 
sorted_students = sorted(students, key=lambda student: (student['grade'], student['age'])) 
print(sorted_students)
[{'name': 'Alice', 'age': 22, 'grade': 'A'}, {'name': 'John', 'age': 20, 'grade': 'B'}, {'name': 'Bob', 'age': 19, 'grade': 'C'}]

Эта таблица предоставляет краткое описание и примеры использования функции sorted(), включая различные параметры и типичные случаи применения.

 

Использование функции sorted() с параметром key — это мощный инструмент для сортировки различных структур данных. В сочетании с анонимными функциями lambda, вы можете легко настраивать сортировку по любым критериям, что позволяет значительно расширить возможности работы с данными.

Перейти к следующему шагу

Комментарии