Python sorted sort function

Функция sorted#

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

Первый аспект, на который важно обратить внимание — sorted всегда возвращает список.

Если сортировать список элементов, то возвращается новый список:

In [1]: list_of_words = ['one', 'two', 'list', '', 'dict'] In [2]: sorted(list_of_words) Out[2]: ['', 'dict', 'list', 'one', 'two'] 

При сортировке кортежа также возвращается список:

In [3]: tuple_of_words = ('one', 'two', 'list', '', 'dict') In [4]: sorted(tuple_of_words) Out[4]: ['', 'dict', 'list', 'one', 'two'] 
In [5]: set_of_words = 'one', 'two', 'list', '', 'dict'> In [6]: sorted(set_of_words) Out[6]: ['', 'dict', 'list', 'one', 'two'] 
In [7]: string_to_sort = 'long string' In [8]: sorted(string_to_sort) Out[8]: [' ', 'g', 'g', 'i', 'l', 'n', 'n', 'o', 'r', 's', 't'] 

Если передать sorted словарь, функция вернет отсортированный список ключей:

In [9]: dict_for_sort =  . : 'id': 1, . : 'name': 'London', . : 'IT_VLAN': 320, . : 'User_VLAN': 1010, . : 'Mngmt_VLAN': 99, . : 'to_name': None, . : 'to_id': None, . : 'port': 'G1/0/11' . : > In [10]: sorted(dict_for_sort) Out[10]: ['IT_VLAN', 'Mngmt_VLAN', 'User_VLAN', 'id', 'name', 'port', 'to_id', 'to_name'] 

reverse#

Флаг reverse позволяет управлять порядком сортировки. По умолчанию сортировка будет по возрастанию элементов.

Указав флаг reverse, можно поменять порядок:

In [11]: list_of_words = ['one', 'two', 'list', '', 'dict'] In [12]: sorted(list_of_words) Out[12]: ['', 'dict', 'list', 'one', 'two'] In [13]: sorted(list_of_words, reverse=True) Out[13]: ['two', 'one', 'list', 'dict', ''] 

key#

С помощью параметра key можно указывать, как именно выполнять сортировку. Параметр key ожидает функцию, с помощью которой должно быть выполнено сравнение.

Например, таким образом можно отсортировать список строк по длине строки:

In [14]: list_of_words = ['one', 'two', 'list', '', 'dict'] In [15]: sorted(list_of_words, key=len) Out[15]: ['', 'one', 'two', 'list', 'dict'] 

Если нужно отсортировать ключи словаря, но при этом игнорировать регистр строк:

In [16]: dict_for_sort =  . : 'id': 1, . : 'name':'London', . : 'IT_VLAN':320, . : 'User_VLAN':1010, . : 'Mngmt_VLAN':99, . : 'to_name': None, . : 'to_id': None, . : 'port':'G1/0/11' . : > In [17]: sorted(dict_for_sort, key=str.lower) Out[17]: ['id', 'IT_VLAN', 'Mngmt_VLAN', 'name', 'port', 'to_id', 'to_name', 'User_VLAN'] 

Параметру key можно передавать любые функции, не только встроенные. Также тут удобно использовать анонимную функцию lambda.

С помощью параметра key можно сортировать объекты не по первому элементу, а по любому другому. Но для этого надо использовать или функцию lambda, или специальные функции из модуля operator.

Например, чтобы отсортировать список кортежей из двух элементов по второму элементу, надо использовать такой прием:

In [18]: from operator import itemgetter In [19]: list_of_tuples = [('IT_VLAN', 320), . : ('Mngmt_VLAN', 99), . : ('User_VLAN', 1010), . : ('DB_VLAN', 11)] In [20]: sorted(list_of_tuples, key=itemgetter(1)) Out[20]: [('DB_VLAN', 11), ('Mngmt_VLAN', 99), ('IT_VLAN', 320), ('User_VLAN', 1010)] 

Пример сортировки разных объектов#

Сортировка выполняется по первому элементу, например, по первому символу в списке строк, если он одинаковый, по второму и так далее. Сортировка выполняется по коду Unicode символа. Для символов из одного алфавита, это значит что сортировка по сути будет по алфавиту.

Пример сортировки списка строк:

In [6]: data = ["test1", "test2", "text1", "text2"] In [7]: sorted(data) Out[7]: ['test1', 'test2', 'text1', 'text2'] 

Некоторые данные будут сортироваться неправильно, например, список IP-адресов:

In [11]: ip_list = ["10.1.1.1", "10.1.10.1", "10.1.2.1", "10.1.11.1"] In [12]: sorted(ip_list) Out[12]: ['10.1.1.1', '10.1.10.1', '10.1.11.1', '10.1.2.1'] 

Это происходит потому используется лексикографическая сортировка. Чтобы в данном случае сортировка была нормальной, надо или использовать отдельный модуль с натуральной сортировкой (модуль natsort) или сортировать, например, по двоичному/десятичному значению адреса.

Пример сортировки IP-адресов по двоичному значению. Сначала создаем функцию, которая преобразует IP-адреса в двоичный формат:

In [15]: def bin_ip(ip): . : octets = [int(o) for o in ip.split(".")] . : return (" "*4).format(*octets) . : In [16]: bin_ip("10.1.1.1") Out[16]: '00001010000000010000000100000001' In [17]: bin_ip("160.1.1.1") Out[17]: '10100000000000010000000100000001' 

Сортировка с использованием функции bin_ip:

In [18]: ip_list = ["10.1.1.1", "10.1.10.1", "10.1.2.1", "10.1.11.1"] In [19]: sorted(ip_list, key=bin_ip) Out[19]: ['10.1.1.1', '10.1.2.1', '10.1.10.1', '10.1.11.1'] 

Также дальше будет рассматриваться модуль ipaddress, который позволит создавать специальные объекты, которые соответствуют IP-адресу и они уже сортируются правильно по десятичному значению.

Источник

Возможности и примеры функции 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 .

Источник

Читайте также:  speech to text in javascript
Оцените статью