sorted
Он используется для сортировки коллекций (коллекции, упомянутые здесь, являются общим термином для итерируемых объектов, они могут быть списками, словарями, наборами или даже строками). Это очень мощный инструмент. В этой статье простым способом будут представлены различные виды сортировки. , сцены, которые будут использоваться.
1. Сортировка по умолчанию
1. По умолчанию функция sorted сортирует список в порядке возрастания и возвращает новый объект списка, исходный список остается без изменений, простейшая сортировка
>>> nums = [3,4,5,2,1]
>>> sorted(nums)
[1, 2, 3, 4, 5]
2. Сортировать по убыванию
2. Сортировать по убыванию Если вы хотите отсортировать по убыванию, вам нужно только указать параметр reverse=True
>>> sorted(nums, reverse=True)
[5, 4, 3, 2, 1]
3, сортировка по пользовательскому правилу
3. Если вы хотите отсортировать по определенному правилу, вам нужно указать параметрыkey
, ключ — это функция (или другой вызываемый объект), например: список строк, я хочу отсортировать по длине строк
>>> chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
>>> sorted(chars, key=len)
['a', 'is', 'from', 'test', 'This', 'Andrew', 'string']
len
Это встроенная функция, функция sorted будет использовать len для получения длины каждой строки для сортировки при сортировке. Некоторые люди могут использовать анонимную функцию key=lambda x: len(x) , но это излишне.
>>> chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
>>> sorted(chars, key=lambda x: len(x))
['a', 'is', 'from', 'test', 'This', 'Andrew', 'string']
4. Составная сортировка
4. Если это составная структура списка, например: список, состоящий из кортежей, которые должны быть отсортированы в соответствии со вторым элементом в кортеже, то вы можете использовать лямбда для определения анонимной функции, вот алфавитный порядок возрастания второй элемент.
>>> students = [('zhang', 'A'), ('li', 'D'), ('wang', 'C')]
>>> sorted(students, key=lambda x: x[1])
[('zhang', 'A'), ('wang', 'C'), ('li', 'D')]
Здесь будет порядок букв A-C-D.
5. Сортировка экземпляров объектов класса
5. Если элемент для сортировки представляет собой пользовательский класс, например класс Student, отсортированный по возрасту, его можно записать как
>>> class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
>>> student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('lily', 'A', 12),
Student('dave', 'B', 10), ]
>>> sorted(student_objects, key=lambda t:t.age)
[('dave', 'B', 10), ('jane', 'B', 12), ('lily', 'A', 12), ('john', 'A', 15)]
6. Сортировка по нескольким значениям
6. Как и сортировка базы данных, sorted также может быть отсортирован по нескольким полям. Например, я должен сначала отсортировать по возрасту. Если возраст одинаковый, он сортируется по классу. Вы можете использовать кортежи:
>>> sorted(student_objects, key=lambda t:(t.age, t.grade))
[('dave', 'B', 10), ('lily', 'A', 12), ('jane', 'B', 12), ('john', 'A', 15)]
7. Упорядочивание значений, не сопоставимых напрямую
7. Сценарии сортировки, встречавшиеся ранее, основаны на предпосылке, что два элемента можно сравнивать друг с другом.Например, значения сравниваются по размеру, а буквы сравниваются в порядке ASCII.Если они несравнимы, мы нужно определить сравнение сами.Как быть с ситуацией правил?
Возьмем простой пример:
>>> nums = [2, 1.5, 2.5, '2', '2.5']
>>> sorted(nums)
TypeError: '<' not supported between instances of 'str' and 'int'
В списке целых чисел могут быть числа и строки.В Python3 нельзя сравнивать строки и числа, а в Python2 можно сравнивать любые типы.В этом большая разница между двумя версиями:
# python2.7
>>> "2.5" > 2
True
# python3.6
>>> "2.5" > 2
TypeError: '>' not supported between instances of 'str' and 'int'
Нам нужно использовать cmp_to_key из модуля functools, чтобы указать, что представляет собой функция сравнения.
import functools
def compare(x1, x2):
if isinstance(x1, str):
x1 = float(x1)
if isinstance(x2, str):
x2 = float(x2)
return x1 - x2
>>>sorted(nums, key=functools.cmp_to_key(compare))
[1.5, 2, '2', 2.5, '2.5']
8. Определите com_to_key
8. Что касается функции сортировки, разница между Python2 и Python3 заключается в том, что сортировка в Python2 может указывать параметр ключевого слова cmp, то есть при обнаружении данных, требующих пользовательской операции сравнения, ее можно реализовать с помощью cmp=compare, и она не обязательно, как в Python 3. Необходимо импортировать реализацию functools.cmp_to_key.
nums = [2, 1.5, 2.5, '2', '2.5']
def compare(x1, x2):
if isinstance(x1, str):
x1 = float(x1)
if isinstance(x2, str):
x2 = float(x2)
return 1 if x1 - x2 > 0 else -1 if x1 - x2 < 0 else 0
>>> sorted(nums, cmp=compare)
[1.5, 2, '2', 2.5, '2.5']
На самом деле, в Python2, если вы не укажете cmp в приведенном выше случае, он будет отсортирован таким образом по умолчанию.Помните, в Python2 можно сравнивать что угодно (между разными типами), а в Python3 только данные тот же тип можно сравнить.
9. Оптимизация сортировки
9. Для списков наборов есть более эффективный способ указать этот ключ
>>> from operator import itemgetter
>>> sorted(students, key=itemgetter(1))
[('zhang', 'A'), ('wang', 'C'), ('li', 'D')]
10. Расширенная сортировка
10. Точно так же для пользовательских классов есть более эффективный способ указания ключей
>>> from operator import attrgetter
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Что делать, если в сортировке участвуют два поля, вы можете сделать это:
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
Все вышесказанное касается функции sorted.
Одновременно опубликовать блог:foo fish.net/Python-сортировка…
Обратите внимание, чтобы получить больше хороших статей в первый раз