- Возможности и примеры функции sorted в Python
- Параметр key
- 1. Встроенная функция
- 2. Пользовательские функции
- 3. Лямбда-функция
- Метод List sort() в Python
- 1. Использование метода List sort() по умолчанию
- 2. Обратная сортировка списка
- 3. Сортировка вложенного списка
- 4. Пользовательская логика для сортировки списка
- 5. Сортировка списка объектов
Возможности и примеры функции sorted в Python
Функция sorted() возвращает новый отсортированный список итерируемого объекта (списка, словаря, кортежа). По умолчанию она сортирует его по возрастанию.
Сортировка строк осуществляется по ASCII-значениям.
- Возвращаемое значение — List (список).
- Синтаксис: sorted(iterable,key=None,reverse=False) .
- iterable : строка, список, кортеж, множество, словарь
- key (необязательный параметр): если указать ключ, то сортировка будет выполнена по функции этого ключа.
- reverse (необязательный параметр): по умолчанию сортировка выполняется по возрастанию. Если указать reverse=True , то можно отсортировать по убыванию.
# Сортировка строки
s2="hello"
print(sorted(s2)) # Вывод:['e', 'h', 'l', 'l', 'o']
print(sorted(s2, reverse=True)) # Вывод:['o', 'l', 'l', 'h', 'e']
# Сортировка списка
l1=[1, 4, 5, 2, 456, 12]
print(sorted(l1)) # Вывод:[1, 2, 4, 5, 12, 456]
print(sorted(l1, reverse=True)) # Вывод:[456, 12, 5, 4, 2, 1]
# Сортировка кортежа
t1=(15, 3, 5, 7, 9, 11, 42)
print(sorted(t1)) # Вывод:[3, 5, 7, 9, 11, 15, 42]
print(sorted(t1, reverse=True)) # Вывод:[42, 15, 11, 9, 7, 5, 3]
# Сортировка списка кортежей
t2=[(1, 2), (11, 12), (0, 2), (3, 2)]
print(sorted(t2)) # Вывод:[(0, 2), (1, 2), (3, 2), (11, 12)]
print(sorted(t2, reverse=True)) # Вывод:[(11, 12), (3, 2), (1, 2), (0, 2)]
# Сортировка множества
s1=
print(sorted(s1)) # Вывод:[1, 2, 3, 4, 6, 8, 11, 32]
print(sorted(s1, reverse=True)) # Вывод:[32, 11, 8, 6, 4, 3, 2, 1]
# Сортировка словаря
d1=
# Вернется список отсортированных ключей
print(sorted(d1)) # Вывод:[1, 2, 3]
# Вернется список отсортированных значений
print(sorted(d1.values())) # Вывод:['blue', 'green', 'red']
# Вернется список кортежей (ключ, значение), отсортированный по ключам.
print(sorted(d1.items())) # Вывод:[(1, 'green'), (2, 'red'), (3, 'blue')]
# Сортировка словаря в обратном порядке
print(sorted(d1, reverse=True)) # Вывод:[3, 2, 1]
print(sorted(d1.values(), reverse=True)) # Вывод:['red', 'green', 'blue']
print(sorted(d1.items(), reverse=True)) # Вывод:[(3, 'blue'), (2, 'red'), (1, 'green')]Параметр key
Итерируемый объект можно также отсортировать по функции, указанной в параметре key . Это может быть:
- Встроенная функция,
- Определенная пользователем функция,
- Лямбда-функция,
- itemgetter,
- attrgetter.
1. Встроенная функция
len() — посчитает длину объекта. Если указать len в виде параметра key, то сортировка будет выполнена по длине.
# Сортировка словаря на основе функции len
l1 =
# Возвращает список ключей, отсортированных по функции len
print(sorted(l1, key=len))
# Вывод: ['red', 'apple', 'carrot']
# Возвращает список значений, отсортированных на основе функции len
print(sorted(l1.values(), key=len))
# Вывод: ['fruit', 'color', 'vegetable']
# Сортировка списка на основе функции len
l1 = ['blue', 'green', 'red', 'orange']
print(sorted(l1, key=len))
# Вывод: ['red', 'blue', 'green', 'orange']abs() вернет абсолютно значение числа. Если задать abs для key , то сортировка будет основана на абсолютном значении.
# Сортировка списка по абсолютному значению
l1 = [1, -4, 5, -7, 9, 2]
print(sorted(l1, key=abs))
# Вывод: [1, 2, -4, 5, -7, 9]str.lower() — конвертирует все символы в верхнем регистре в нижний регистр. В таком случае список будет отсортирован так, будто бы все символы в нижнем регистре.
s1 = "Hello How are you"
# Разбивает строку и сортирует по словам
print(sorted(s1.split()))
# Вывод: ['Hello', 'How', 'are', 'you']
# Разбивает строку и сортирует после применения str.lower ко всем элементам
print(sorted(s1.split(), key=str.lower))
# Вывод: ['are', 'Hello', 'How', 'you']
d1 =
# Возвращает список ключей, отсортированный по значениям
print(sorted(d1))
# Вывод: ['Banana', 'Pears', 'apple']
# Возвращает список ключей, отсортированный после применения str.lower ко всем элементам
print(sorted(d1, key=str.lower))
# Вывод: ['apple', 'Banana', 'Pears']2. Пользовательские функции
Также можно указывать свои функции.
Пример №1: по умолчанию сортировка кортежа происходит по первому элементу в нем. Добавим функцию, которая будет возвращать второй элемент кортежа. Теперь и сортировка будет опираться на соответствующий элемент.
# напишем функцию для получения второго элемента
def sort_key(e):
return e[1]
l1 = [(1, 2, 3), (2, 1, 3), (11, 4, 2), (9, 1, 3)]
# По умолчанию сортировка выполняется по первому элементу
print(sorted(l1))
# Вывод: [(1, 2, 3), (2, 1, 3), (9, 1, 3), (11, 4, 2)]
# Сортировка по второму элементу с помощью функции sort_key
print(sorted(l1, key=sort_key))
# Вывод: [(2, 1, 3), (9, 1, 3), (1, 2, 3), (11, 4, 2)]Пример №2: можно сортировать объекты класса с помощью функций. Вот как это происходит:
- У класса Studen есть три атрибута: name , rollno , grade .
- Создаются три объекта этого класса: s1 , s2 , s3 .
- Создается список s4 , который содержит все три объекта.
- Дальше происходит сортировка по этому списку.
- Определенная функция ( sort_key ) возвращает атрибут rollno .
- В функции sorted эта функция задана для параметра key .
- Теперь sorted() возвращает список объектов Student , которые отсортированы по значению rollno .
class Student:
def __init__(self, name, rollno, grade):
self.name = name
self.rollno = rollno
self.grade = grade
def __repr__(self):
return f"--"
# Создание объектов
s1 = Student("Paul", 15, "second")
s2 = Student("Alex", 12, "fifth")
s3 = Student("Eva", 21, "first")
s4 = [s1, s2, s3]
# Сортировка списка объектов
# Создание функции, которая вернет rollno объекта
def sort_key(s):
return s.rollno
# сортировка списка объектов без ключевого параметра, вызывает TypeError
print(sorted(s4))
# Вывод: TypeError: '>' not supported between instances of 'Student' and 'Student'
# Сортировка списка объектов по атрибуту: rollno
s5 = sorted(s4, key=sort_key)
print(s5)
# Вывод: [Alex-12-fifth, Paul-15-second, Eva-21-first]3. Лямбда-функция
Также в качестве ключа можно задать лямбда-функцию. Сортировка будет выполняться по ней.
Пример №1: сортировка списка объектов класса на основе лямбда-функции, переданной для параметра key .
Метод List sort() в Python
Метод List sort() в Python сортирует элементы списка в порядке возрастания.
В Python есть встроенная функция sorted(), которая используется для создания отсортированного списка из итерируемого объекта.
1. Использование метода List sort() по умолчанию
По умолчанию метод list sort() в Python упорядочивает элементы списка в порядке возрастания. Это также естественный способ сортировки элементов.
numbers_list = [3.4, 5.1, 2.2, 4.1, 1.0, 3.8] print(f'Before sorting: ') numbers_list.sort() print(f'After sorting: ')Before sorting: [3.4, 5.1, 2.2, 4.1, 1.0, 3.8] After sorting: [1.0, 2.2, 3.4, 3.8, 4.1, 5.1]Элементы также могут быть символами или числами, и метод sort() продолжит сортировку в порядке возрастания.
str_list = ['a', 'c', 'd', 'b', 'B', 'C', '1'] str_list.sort() print(str_list) # ['1', 'B', 'C', 'a', 'b', 'c', 'd']2. Обратная сортировка списка
Если вы хотите, чтобы сортировка выполнялась в обратном порядке, передайте обратный аргумент, как True. Мы можем использовать это для сортировки списка чисел в порядке убывания.
numbers_list = [3.4, 5.1, 2.2, 4.1, 1.0, 3.8] print(f'Before sorting: ') numbers_list.sort(reverse=True) print(f'After sorting: ')Before sorting: [3.4, 5.1, 2.2, 4.1, 1.0, 3.8] After sorting: [5.1, 4.1, 3.8, 3.4, 2.2, 1.0]3. Сортировка вложенного списка
Если мы вызываем функцию списка sort() для вложенного списка, для сортировки используются только первые элементы из элементов списка. Давайте разберемся в этом примере.
numbers = [[1, 2], [2, 1], [4, 3], [5, 2], [3, 3]] print(f'Before sorting: ') numbers.sort() print(f'After sorting: ')Before sorting: [[1, 2], [2, 1], [4, 3], [5, 2], [3, 3]] After sorting: [[1, 2], [2, 1], [3, 3], [4, 3], [5, 2]]Понятно, что сортировка производится по первому элементу вложенного списка. Но иногда нам нужно отсортировать вложенный список по позициям разных элементов.
Допустим, вложенный список содержит информацию об имени, возрасте и поле человека. Давайте посмотрим, как отсортировать этот вложенный список по возрасту, который является вторым элементом вложенного списка.
def custom_key(people): return people[1] # second parameter denotes the age persons = [['Alice', 26, 'F'], ['Trudy', 25, 'M'], ['Bob', 25, 'M'], ['Alexa', 22, 'F']] print(f'Before sorting: ') persons.sort(key=custom_key) print(f'After sorting: ')Before sorting: [['Alice', 26, 'F'], ['Trudy', 25, 'M'], ['Bob', 25, 'M'], ['Alexa', 22, 'F']] After sorting: [['Alexa', 22, 'F'], ['Trudy', 25, 'M'], ['Bob', 25, 'M'], ['Alice', 26, 'F']]Мы используем ключевой аргумент, чтобы указать элемент, который будет использоваться для целей сортировки. Функция custom_key возвращает ключ для сортировки списка.
4. Пользовательская логика для сортировки списка
Мы также можем реализовать вашу собственную логику для сортировки элементов списка.
В последнем примере мы использовали возраст как ключевой элемент для сортировки нашего списка.
Но есть такая поговорка: «Сначала дамы!». Итак, мы хотим отсортировать наш список таким образом, чтобы женский пол имел приоритет над мужским. Если пол двух человек совпадает, младший получает более высокий приоритет.
Итак, мы должны использовать ключевой аргумент в нашей функции сортировки. Но функцию сравнения нужно преобразовать в ключ.
Итак, нам нужно импортировать библиотеку под названием functools. Мы будем использовать функцию cmp_to_key(), чтобы преобразовать compare_function в key.
import functools def compare_function(person_a, person_b): if person_a[2] == person_b[2]: # if their gender become same return person_a[1] - person_b[1] # return True if person_a is younger else: # if their gender not matched if person_b[2] == 'F': # give person_b first priority if she is female return 1 else: # otherwise give person_a first priority return -1 persons = [['Alice', 26, 'F'], ['Trudy', 25, 'M'], ['Bob', 24, 'M'], ['Alexa', 22, 'F']] print(f'Before sorting: ') persons.sort(key=functools.cmp_to_key(compare_function)) print(f'After sorting: ')Before sorting: [['Alice', 26, 'F'], ['Trudy', 25, 'M'], ['Bob', 24, 'M'], ['Alexa', 22, 'F']] After sorting: [['Alexa', 22, 'F'], ['Alice', 26, 'F'], ['Bob', 24, 'M'], ['Trudy', 25, 'M']]Список сначала сортируется по полу. Затем он сортируется по возрасту людей.
5. Сортировка списка объектов
Сортировка по умолчанию работает с числами и строками. Но это не будет работать со списком настраиваемых объектов. Посмотрим, что произойдет, когда мы попытаемся запустить сортировку по умолчанию для списка объектов.
class Employee: def __init__(self, n, a, gen): self.name = n self.age = a self.gender = gen def __str__(self): return f'Emp[::]' # List uses __repr__, so overriding it to print useful information __repr__ = __str__ e1 = Employee('Alice', 26, 'F') e2 = Employee('Trudy', 25, 'M') e3 = Employee('Bob', 24, 'M') e4 = Employee('Alexa', 22, 'F') emp_list = [e1, e2, e3, e4] print(f'Before Sorting: ') try: emp_list.sort() except TypeError as te: print(te)Before Sorting: [Emp[Alice:26:F], Emp[Trudy:25:M], Emp[Bob:24:M], Emp[Alexa:22:F]] 'В этом случае мы должны в обязательном порядке предоставить ключевую функцию для указания поля объектов, которое будет использоваться для сортировки.
# sorting based on age def sort_by_age(emp): return emp.age emp_list.sort(key=sort_by_age) print(f'After Sorting By Age: ')After Sorting By Age: [Emp[Alexa:22:F], Emp[Bob:24:M], Emp[Trudy:25:M], Emp[Alice:26:F]]Мы также можем использовать модуль functools для создания пользовательской логики сортировки для элементов списка.