• burger-icon

    Шаг 8. Сортировка коллекций

    Баллов за прохождение: 1

    Сортировка коллекций

    Сортировка коллекций часто может понадобиться в решаемых задачах. Например, отсортировать список пользователей по алфавиту, или, наоборот, вывести его в обратном порядке. На этом уроке мы рассмотрим основные методы сортировки.

    Функция sorted()

    В Python существует встроенная функция, позволяющую вывести список сортированных элементов, не изменяя исходную коллекцию.

    my_list = ['b', 'a', 'd', 'c']
    my_list = sorted(my_list)
    print(my_list) # ['a', 'b', 'c', 'd']

    Так как данная функция не изменяет исходную коллекцию, мы можем применить ее к неизменяемым коллекциям

    my_tuple = (1, 3, 4, 2, 5)
    my_tuple = sorted(my_tuple)
    print(my_tuple) # [1, 2, 3, 4, 5], sorted() всегда возвращает список

    В сортировке возвращаемых элементов не имеет значения, был ли у элемента индекс в изначальной коллекции, поэтому мы можем применить sorted() и к неиндексируемым коллекциям

    my_set = {2, 4, 1, 5 ,3}
    my_set = sorted(my_set)
    print(my_set) # [1, 2, 3, 4, 5]

    sorted() имеет дополнительные необязательные аргументы:

    reverse=True - сортировка коллекций в обратном порядке

    key=func - сортировка с помощью специальной функции, она может быть как стандартной функцией Python, так и быть написанной вами для определенных задач или лямбдой.

    Сортировка списка в обратном порядке

    my_list = ['b', 'a', 'd', 'c']
    my_list = sorted(my_list, reverse=True)
    print(my_list) # ['d', 'c', 'b', 'a']

    Сортировка списка по длине элемента

    my_list = ['world', 'Im', 'sorted list', 'hello']
    my_list = sorted(my_list, key=len)
    print(my_list) # ['Im', 'world', 'hello', 'sorted list']

    Функция reversed()

    Функция reversed() работает иначе, чем функция sorted():

    Она читает список с конца, а не сортирует элементы

    Она возвращает не список, а генератор списка

    Ее невозможно применить к неиндексируемым коллекциям - получим исключение TypeError: argument to reversed() must be a sequence

    Она не позволяет использовать дополнительные аргументы

    Рассмотрим пример:

    my_list = [1, 2, 3, 4, 5]
    my_list = reversed(my_list)
    print(my_list) # <list_reverseiterator object at 0x000001D301599960>, возвращает генератор

    Изначально, как и было написано выше, reversed() возвращает генератор списка. Мы можем это поведение двумя способами:

    Обернуть reversed() в list():

    my_list = [1, 2, 3, 4, 5]
    my_list = list(reversed(my_list))
    print(my_list) # [5, 4, 3, 2, 1]

    Воспользоваться срезами

    my_list = [1, 2, 3, 4, 5]
    print(my_list[::-1]) # [5, 4, 3, 2, 1]

    Методы .sort() и .reverse()

    У списка существуют методы .sort() и .reverse(), которые похожи по функционалу на sorted() и reversed(), но имеют и свои существенные отличия:

    Изменяют исходный список, без генерации нового

    Возвращают None

    В них не передается список первым аргументом, если это сделать - будет вызвано исключение

    my_list = [1, 4, 2, 3, 5]
    my_list.sort()
    print(my_list) # [1, 2, 3, 4, 5]

    Обратите внимание, если переопределить наш список, то он вернет None

    my_list = [1, 4, 2, 3, 5]
    my_list = my_list.sort()
    print(my_list) # None

    .reverse() работает похожим образом

    my_list = [1, 4, 2, 3, 5]
    my_list.reverse()
    print(my_list) # [5, 3, 2, 4, 1]

    И он так же возвращает None если переопределить список

    my_list = [1, 4, 2, 3, 5]
    my_list = my_list.reverse()
    print(my_list) # None

    Сортировка словарей

    Сортировка словарей имеет некоторые особенности:

    Для того, чтобы отсортировать словарь по ключам и вернуть список ключей, можем использовать sorted(my_dict), либо sorted(my_dict.keys())

    my_dict = {
        'name': 'Nikita',
        'hobby': 'programming',
    }
    my_dict = sorted(my_dict)
    print(my_dict) # ['hobby', 'name']

    Чтобы вернуть отсортированный список значений, используем sorted(my_dict.values())

    my_dict = {
        'name': 'Nikita',
        'hobby': 'programming',
    }
    my_dict = sorted(my_dict.values())
    print(my_dict) # ['Nikita', 'programming']

    Для получения списка кортежей, отсортированных по ключу, используем sorted(my_dict.items())

    my_dict = {
        'name': 'Nikita',
        'hobby': 'programming',
    }
    my_dict = sorted(my_dict.items())
    print(my_dict) # [('hobby', 'programming'), ('name', 'Nikita')]

     


    map(), filter(), reduce()

    Смотреть на YouTube

    Для решения задачи, Зарегистрируйтесь или Войдите на сайт.