Чем отличается sort от sorted в питоне
Метод sort() и функция sorted() в Python: различия и применение
10 апреля 2023
Оценки статьи
Еще никто не оценил статью
Сортировка — это процесс организации элементов коллекции в определенном порядке. В Python для сортировки коллекций можно использовать метод sort() для списков и функцию sorted() для различных итерируемых объектов. Обе эти функции позволяют сортировать элементы в порядке возрастания или убывания, в зависимости от указанного параметра.
Функция sorted() в Python
Функция sorted() возвращает новый отсортированный список (list) из переданной ей итерируемой коллекции. Функция возвращает отсортированный список, не меняя порядок элементов в исходной коллекции.
Синтаксис функции sorted():
sorted(iterable, key=None, reverse=False)
где:
- iterable : обязательный параметр, представляющий итерируемый объект или встроенную последовательность, элементы которого требуется отсортировать.
- key : необязательный параметр, представляющий функцию, которая определяет ключ сортировки. По умолчанию None , что означает сортировку по значениям элементов.
- reverse : необязательный параметр, определяющий порядок сортировки. Если — reverse=True , то сортировка будет производиться в обратном порядке (от большего к меньшему), а если reverse=False (по умолчанию), то сортировка будет производиться в прямом порядке (от меньшего к большему).
Пример использования функции sorted():
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_numbers = sorted(numbers) print(sorted_numbers) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] fruits = ('apple', 'orange', 'banana', 'cherry', 'date', 'apricot') sorted_fruits = tuple(sorted(fruits)) print(sorted_fruits) # ('apple', 'apricot', 'banana', 'cherry', 'date', 'orange')
Данный код использует функцию sorted() для сортировки различных коллекций: списка numbers , кортежа fruits и словаря word_count .
Для списка numbers функция sorted() сортирует числа в порядке возрастания и сохраняет отсортированный список в переменную sorted_numbers . Результат выводится на экран с помощью функции print() , и на экран выводится отсортированный список sorted_numbers , который выглядит следующим образом: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] .
Для кортежа fruits функция sorted() сортирует строки в алфавитном порядке и сохраняет отсортированный список в переменную sorted_fruits . Затем с помощью функции tuple() отсортированный список sorted_fruits преобразуется обратно в кортеж. Результат выводится на экран с помощью функции print() , и на экран выводится отсортированный кортеж sorted_fruits , который выглядит следующим образом: (‘apple’, ‘apricot’, ‘banana’, ‘cherry’, ‘date’, ‘orange’) .
Для словаря word_count функция sorted() сортирует элементы словаря (пары «ключ-значение») на основе значений (в данном случае, по убыванию значения) с помощью аргумента key , указав лямбда-функцию, которая возвращает значение x[1] . Отсортированные пары «ключ-значение» сохраняются в переменную sorted_word_count . Затем с помощью функции dict() отсортированные пары «ключ-значение» преобразуются обратно в словарь. Результат выводится на экран с помощью функции print() , и на экран выводится отсортированный словарь sorted_word_count , который выглядит следующим образом:
Метод sort() в Python
Метод sort() — это встроенный метод в Python, который используется для сортировки элементов в списке на месте, то есть изменяет оригинальный список, не создавая нового списка. Метод sort() имеет следующий синтаксис:
list.sort(key=None, reverse=False)
где:
- key (опционально) — функция, которая указывает на то, по какому критерию должна выполняться сортировка. Если не указана, то сортировка будет производиться по значениям элементов списка по умолчанию.
- reverse (опционально) — булевое значение, указывающее на то, нужно ли выполнять сортировку в обратном порядке (по умолчанию равно False , то есть сортировка выполняется в возрастающем порядке).
Сортировка списка чисел в возрастающем порядке:
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] numbers.sort() print(numbers) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
Данный код выполняет сортировку списка numbers в порядке возрастания с использованием метода sort() . Сначала создается список чисел numbers с заданными значениями: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] . Затем вызывается метод sort() на этом списке, который сортирует его в порядке возрастания. После сортировки список numbers будет изменен и содержать числа в отсортированном порядке: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] .
Сортировка списка строк в алфавитном порядке:
fruits = ['apple', 'orange', 'banana', 'cherry', 'date', 'apricot'] fruits.sort() print(fruits) # ['apricot', 'banana', 'cherry', 'date', 'orange']
Данный код выполняет сортировку списка fruits в алфавитном порядке с использованием метода sort() . Сначала создается список фруктов fruits с заданными значениями: [‘apple’, ‘orange’, ‘banana’, ‘cherry’, ‘date’, ‘apricot’] . Затем вызывается метод sort() на этом списке, который сортирует его в алфавитном порядке (по порядку символов в строках) в возрастающем порядке. После сортировки список fruits будет изменен и содержать фрукты в алфавитном порядке: [‘apricot’, ‘banana’, ‘cherry’, ‘date’, ‘orange’] .
Сортировка списка объектов пользовательского класса Person по возрасту, используя функцию key:
class Person: def __init__(self, name, age): self.name = name self.age = age people = [Person("Alice", 25), Person("Bob", 30), Person("Charlie", 22), Person("Dave", 28)] people.sort(key=lambda x: x.age) for person in people: print(person.name, person.age) # Output: # Charlie 22 # Alice 25 # Dave 28 # Bob 30
Данный код содержит определение класса Person и создание списка объектов этого класса people . Затем выполняется сортировка списка people по возрасту объектов с использованием метода sort() и аргумента key с лямбда-функцией lambda x: x.age .
Пояснение к коду:
class Person: — определение класса Person , который имеет два атрибута name и age . def __init__(self, name, age): — определение конструктора класса Person, который инициализирует атрибуты name и age объекта при его создании. self.name = name и self.age = age — установка значений атрибутов name и age объекта Person на основе переданных аргументов конструктора. people = [Person(«Alice», 25), Person(«Bob», 30), Person(«Charlie», 22), Person(«Dave», 28)] — создание списка people , содержащего объекты класса Person с заданными значениями имени и возраста. people.sort(key=lambda x: x.age) — сортировка списка people по возрасту объектов. Аргумент key указывает на функцию, которая будет использоваться для определения ключа сортировки. В данном случае, используется лямбда-функция lambda x: x.age , которая возвращает значение атрибута age объекта x , на основе которого будет выполняться сортировка. for person in people: — цикл for , который перебирает каждый объект person в списке people . print(person.name, person.age) — вывод имени и возраста каждого объекта person на экран. Объекты person будут выведены в порядке, определенном после сортировки, что будет отражать их возраст в порядке возрастания.
Сортировка в обратном порядке с помощью sort() и sorted()
Метод sort() и функция sorted() также имеют дополнительный параметр reverse , который может быть использован для сортировки коллекций в обратном порядке.
Например, если нам нужно отсортировать список чисел по убыванию, мы можем передать параметр reverse=True :
my_list = [4, 2, 1, 3, 5] sorted_list = sorted(my_list, reverse=True) print(sorted_list) # [5, 4, 3, 2, 1] my_list.sort(reverse=True) print(my_list) # [5, 4, 3, 2, 1]
Данный код выполняет сортировку списка my_list в обратном порядке с использованием функции sorted() и метода sort() с аргументом reverse=True .
Пояснение к коду:
my_list = [4, 2, 1, 3, 5] — создание списка my_list с данными числами. sorted_list = sorted(my_list, reverse=True) — вызов функции sorted() с аргументом my_list и аргументом reverse=True , что указывает на сортировку в обратном порядке. Результат сортировки сохраняется в переменной sorted_list . print(sorted_list) — вывод отсортированного списка на экран. Результат будет [5, 4, 3, 2, 1] , так как числа отсортированы в порядке убывания. my_list.sort(reverse=True) — вызов метода sort() на списке my_list с аргументом reverse=True , что указывает на сортировку списка в обратном порядке. print(my_list) — вывод списка my_list после сортировки на экран. Результат будет [5, 4, 3, 2, 1] , так как список my_list был отсортирован в обратном порядке с использованием метода sort() . Обратите внимание, что метод sort() выполняет сортировку «на месте», то есть изменяет сам список my_list без создания нового списка.
Обратите внимание, что мы также могли бы использовать параметр key , чтобы определить функцию, которая будет использоваться для сравнения элементов списка.
Еще один пример:
words = ['dog', 'cat', 'fish', 'elephant', 'lion'] sorted_words = sorted(words, reverse=True, key=len) print(sorted_words) # ['elephant', 'lion', 'fish', 'cat', 'dog'] words.sort(reverse=True, key=len) print(words) # ['elephant', 'lion', 'fish', 'cat', 'dog']
В этом примере мы отсортировали список words в обратном порядке по длине слов с помощью параметра key=len . Это означает, что более длинные слова будут идти раньше в списке.
Далее мы рассмотрим кастомные функции сортировки.
Сортировка строк по длине в Python
strings = ['some', 'example', 'words', 'here'] # сортировка по длине строк (от меньшей к большей) strings.sort(key=len) print(strings) # ['some', 'here', 'words', 'example'] # сортировка по длине строк (от большей к меньшей) sorted_strings = sorted(strings, key=len, reverse=True) print(sorted_strings) # ['example', 'words', 'some', 'here']
Данный код выполняет сортировку списка strings на основе длины строк в нем с использованием функции sorted() и метода sort() с ключом сортировки key=len и аргументом reverse=True для обратной сортировки.
Пояснение к коду:
strings = [‘some’, ‘example’, ‘words’, ‘here’] — создание списка strings с данными строками. strings.sort(key=len) — вызов метода sort() на списке strings с ключом сортировки key=len , что указывает на сортировку списка на основе длины строк в порядке возрастания. Результат сортировки сохраняется в самом списке strings . print(strings) — вывод отсортированного списка strings на экран. Результат будет [‘some’, ‘here’, ‘words’, ‘example’] , так как строки отсортированы в порядке возрастания длины. sorted_strings = sorted(strings, key=len, reverse=True) — вызов функции sorted() с аргументом strings , ключом сортировки key=len и аргументом reverse=True , что указывает на сортировку списка на основе длины строк в порядке убывания. Результат сортировки сохраняется в переменной sorted_strings . print(sorted_strings) — вывод отсортированного списка sorted_strings на экран. Результат будет [‘example’, ‘words’, ‘some’, ‘here’] , так как строки отсортированы в порядке убывания длины с использованием функции sorted() .
Сортировка чисел по четности в Python
numbers = [3, 5, 1, 2, 4, 6] # сортировка чисел по четности (сначала нечетные, потом четные) numbers.sort(key=lambda x: x % 2) print(numbers) # [3, 5, 1, 2, 4, 6] # сортировка чисел по четности (сначала четные, потом нечетные) sorted_numbers = sorted(numbers, key=lambda x: x % 2, reverse=True) print(sorted_numbers) # [6, 4, 2, 5, 3, 1]
Данный код выполняет сортировку списка numbers на основе четности чисел в нем с использованием функции sorted() и метода sort() с ключом сортировки key=lambda x: x % 2 и аргументом reverse=True для обратной сортировки.
Пояснение к коду:
numbers = [3, 5, 1, 2, 4, 6] — создание списка numbers с данными числами. numbers.sort(key=lambda x: x % 2) — вызов метода sort() на списке numbers с ключом сортировки key=lambda x: x % 2 , что указывает на сортировку списка на основе остатка от деления чисел на 2. Таким образом, нечетные числа будут идти перед четными числами в порядке возрастания остатка от деления. Результат сортировки сохраняется в самом списке numbers . print(numbers) — вывод отсортированного списка numbers на экран. Результат будет [3, 5, 1, 2, 4, 6] , так как числа отсортированы в порядке нечетных чисел перед четными числами. sorted_numbers = sorted(numbers, key=lambda x: x % 2, reverse=True) — вызов функции sorted() с аргументом numbers , ключом сортировки key=lambda x: x % 2 и аргументом reverse=True , что указывает на сортировку списка на основе остатка от деления чисел на 2 в порядке убывания. Таким образом, четные числа будут идти перед нечетными числами. Результат сортировки сохраняется в переменной sorted_numbers . print(sorted_numbers) — вывод отсортированного списка sorted_numbers на экран. Результат будет [6, 4, 2, 5, 3, 1] , так как числа отсортированы в порядке четных чисел перед нечетными числами с использованием функции sorted() . Это только некоторые примеры кастомных сортировок, с помощью функций sort() и sorted() можно реализовать множество других сортировок в зависимости от конкретной задачи.
Меню категорий
- Загрузка категорий.
Особенности сортировки через sort() и sorted()
Здесь мы с вами затронем вопрос сортировки итерируемых объектов с помощью метода sort() и функции sorted(). Давайте вначале посмотрим на отличие в их вызовах. Если у нас имеется какой-либо список:
a=[1,-45,3,2,100,-4]
то этот объект имеет встроенный метод sort, который меняет его состояние и расставляет элементы по возрастанию:
a.sort()
Получим измененный список:
[-45, -4, 1, 2, 3, 100]
А вот коллекции кортежи или строки:
b=("ab", "bc", "wd", "gf") c = "hello world"
не имеют такого встроенного метода и попытка их отсортировать, записав:
b.sort() c.sort()
приведет к ошибке. Для их сортировки как раз и можно воспользоваться второй функцией sorted:
sorted(b)
на выходе получим упорядоченный список
Обратите внимание, чтобы мы не передавали в качестве аргумента функции sorted, на выходе будем получать именно список отсортированных данных. В данном случае передаем кортеж, а получаем – список.
Или же, со строкой:
sorted(c)
результатом будет упорядоченная коллекция из символов:
Причем, эта функция не меняет исходные коллекции b и c, она возвращает новый список с отсортированными данными. В то время как метод sort для списка меняет этот список. Вот на это следует также обращать внимание. То есть, если нам нужно сохранить результат сортировки в переменной, это делается так:
res = sorted(b)
и res будет ссылаться на список:
Также следует иметь в виду, что сортировка данных возможна для однотипных элементов: или чисел, или строк, или кортежей, но не их комбинаций. Например, вот такой список:
a=[1,-45,3,2,100,-4, "b"]
отсортировать не получится:
a.sort()
возникнет ошибка, что строку нельзя сравнивать с числом. И то же самое с функцией sorted:
sorted(a)
Если уберем последний элемент:
a=[1,-45,3,2,100,-4]
то все будет работать:
sorted(a)
И этот пример также показывает, что список можно сортировать и с помощью метода sort и с помощью функции sorted. Разница только в том, что метод sort не создает новой коллекции, а меняет уже существующую. Функция же sorted не меняет исходную коллекцию, а создает новую с отсортированными элементами. Поэтому, для изменения коллекции a здесь следует записывать такую конструкцию:
a = sorted(a)
Оба этих подхода к сортировке поддерживают необязательный параметр
который определяет порядок сортировки: по возрастанию (False) или по убыванию (True). По умолчанию стоит значение reverse=False. Если мы запишем его вот так:
a = sorted(a, reverse=True)
то получим сортировку по убыванию:
[100, 3, 2, 1, -4, -45]
И то же самое с методом sort:
a.sort(reverse=True)
Давайте еще посмотрим, как будет работать сортировка для словаря:
d = {'river': "река", 'house': "дом", 'tree': "дерево", 'road': "дорога"}
Очевидно, для него мы можем использовать только функцию sorted():
sorted(d)
которая на выходе даст список с ключами, отсортированными по возрастанию. И это логично, так как словарь по умолчанию возвращает именно ключи при его итерировании.
Также можно использовать конструкции вида:
sorted(d.values())
sorted(d.items())
Работают они очевидным образом.
Надеюсь, из этого занятия вы лучше стали понимать, как можно выполнять сортировку различных коллекций в языке Python. Для закрепления этого материала вас ждут практические задания, а я буду всех ждать на следующем уроке, где мы продолжим эту тему и поговорим о тонкой настройке алгоритма сортировки данных.
Видео по теме
#1. Первое знакомство с Python Установка на компьютер
#2. Варианты исполнения команд. Переходим в PyCharm
#3. Переменные, оператор присваивания, функции type и id
#4. Числовые типы, арифметические операции
#5. Математические функции и работа с модулем math
#6. Функции print() и input(). Преобразование строк в числа int() и float()
#7. Логический тип bool. Операторы сравнения и операторы and, or, not
#8. Введение в строки. Базовые операции над строками
#9. Знакомство с индексами и срезами строк
#10. Основные методы строк
#11. Спецсимволы, экранирование символов, row-строки
#12. Форматирование строк: метод format и F-строки
#13. Списки — операторы и функции работы с ними
#14. Срезы списков и сравнение списков
#15. Основные методы списков
#16. Вложенные списки, многомерные списки
#17. Условный оператор if. Конструкция if-else
#18. Вложенные условия и множественный выбор. Конструкция if-elif-else
#19. Тернарный условный оператор. Вложенное тернарное условие
#20. Оператор цикла while
#21. Операторы циклов break, continue и else
#22. Оператор цикла for. Функция range()
#23. Примеры работы оператора цикла for. Функция enumerate()
#24. Итератор и итерируемые объекты. Функции iter() и next()
#25. Вложенные циклы. Примеры задач с вложенными циклами
#26. Треугольник Паскаля как пример работы вложенных циклов
#27. Генераторы списков (List comprehensions)
#28. Вложенные генераторы списков
#29. Введение в словари (dict). Базовые операции над словарями
#30. Методы словаря, перебор элементов словаря в цикле
#31. Кортежи (tuple) и их методы
#32. Множества (set) и их методы
#33. Операции над множествами, сравнение множеств
#34. Генераторы множеств и генераторы словарей
#35. Функции: первое знакомство, определение def и их вызов
#36. Оператор return в функциях. Функциональное программирование
#37. Алгоритм Евклида для нахождения НОД
#38. Именованные аргументы. Фактические и формальные параметры
#39. Функции с произвольным числом параметров *args и **kwargs
#40. Операторы * и ** для упаковки и распаковки коллекций
#41. Рекурсивные функции
#42. Анонимные (lambda) функции
#43. Области видимости переменных. Ключевые слова global и nonlocal
#44. Замыкания в Python
#45. Введение в декораторы функций
#46. Декораторы с параметрами. Сохранение свойств декорируемых функций
#47. Импорт стандартных модулей. Команды import и from
#48. Импорт собственных модулей
#49. Установка сторонних модулей (pip install). Пакетная установка
#50. Пакеты (package) в Python. Вложенные пакеты
#51. Функция open. Чтение данных из файла
#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов
#53. Запись данных в файл в текстовом и бинарном режимах
#54. Выражения генераторы
#55. Функция-генератор. Оператор yield
#56. Функция map. Примеры ее использования
#57. Функция filter для отбора значений итерируемых объектов
#58. Функция zip. Примеры использования
#59. Сортировка с помощью метода sort и функции sorted
#60. Аргумент key для сортировки коллекций по ключу
#61. Функции isinstance и type для проверки типов данных
#62. Функции all и any. Примеры их использования
#63. Расширенное представление чисел. Системы счисления
#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы
#65. Модуль random стандартной библиотеки
#66. Аннотация базовыми типами
#67. Аннотации типов коллекций
#68. Аннотации типов на уровне классов
#69. Конструкция match/case. Первое знакомство
#70. Конструкция match/case с кортежами и списками
#71. Конструкция match/case со словарями и множествами
#72. Конструкция match/case. Примеры и особенности использования
© 2023 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Как работает метод sort в python?
В python, метод sort применяется к спискам(в отличие от функции sorted() , которая применяется к любым итерируемым объектам). Важно, что все элементы списка должны быть одинакового типа(строки, числа, кортежи). Метод list.sort() изменяет список по месту, и возвращает None . Если вызвать метод без параметров, то элементы списка отсортируются в порядке возрастания.
my_list = [7, 5, 8, 2, 11, 1, 14] my_list.sort() print(my_list) # [1, 2, 5, 7, 8, 11, 14]
Сортировка в порядке убывания:
my_list = [7, 5, 8, 2, 11, 1, 14] my_list.sort(reverse=True) print(my_list) # [14, 11, 8, 7, 5, 2, 1]
Также, метод sort может принимать параметр key (функция), по которому будет произведена сортировка:
my_list = [7, 5, 8, 2, 11, 1, 14] my_list.sort(key=lambda x: x%2)
в данном случае, сначала в отсортированном списке буду четные, а потом нечетные элементы.
Функция 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-адресу и они уже сортируются правильно по десятичному значению.