10 советов по встроенной функции отсортировано

задняя часть база данных Python .NET

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-сортировка…

Обратите внимание, чтобы получить больше хороших статей в первый раз

公众号:Python之禅