Как работает эта функция в пайтон?

def quicksort(array):
if len(array) < 2:
    return array
else:
    pivot = array[0]
    less = [i for i in array[1:] if i < pivot]
    greater = [i for i in array[1:] if i > pivot]

    return quicksort(less) + [pivot] + quicksort(greater)
print(quicksort([3,4,5,2,1]))

я так понимаю, что less берёт меньшие числа чем pivot, а greater берёт большие чем pivot, но по какому принципу эти две переменные это делают? Почему в [i for i in array[1:] if i > pivot] перед циклом стоит i? И в чём суть условия if i > pivot]? После этого условия же ничего не стоит.

Если так важно, то это из книжки "Грокаем алгоритмы", на странице 92, издание 2022 года.


Ответы (3 шт):

Автор решения: n1tr0xs

В данном примере используется list comrehension (генератор списка). Если развернуть его в привычный цикл, то это выглядит так:

less = []
for i in array[1:]:
    if i<pivot:
        less.append(i)

Соответсвенно:

  • i в начале генератора - это элемент, из котого собирается список;
  • for i in array[1:] откуда этот элемент берется;
  • if i<pivot - фильтрация элементов.
→ Ссылка
Автор решения: Vladislav Pavkin
[i for i in array[1:] if i < pivot]

— Это не совсем цикл, это list comprehension. Специальное выражение, свойственное python, для удобной сокращённой записи циклов.

Означает: сделать новый список, где будет каждый i из всех i, находящихся в array[:1], но только если i меньше pivot.

Вместо i можно использовать здесь любое понятное вам имя.

https://www.w3schools.com/python/python_lists_comprehension.asp

→ Ссылка
Автор решения: Павел

Это называется - list comprehenshion (генераторы списков).

Позволяют создавать списки "на лету" по некоторому условию.

Как это работает:

  1. Всё записывается в квадратных скобках, по аналогии с тем, как создавать список.
  2. Далее указывается тот элемент, который будет помещен в итоговый список (в вашем случае - это элемент i)
  3. Далее определяется то, откуда этот элемент берется (i for i in array[1:]), то есть в новый список будут добавлены все элементы из array[1:], если бы например было написано i**2 for i in array[1:], то добавлялись бы не сами элементы, а их квадраты.
  4. И дополнительно можно ещё написать некоторое условие, по которому элементы будут добавляться в новый список, if i > pivot

В заключение имеем, что мы получаем новый список из всех элементов array[1:], которые превосходят значение pivot.

Это базовая информация про list comprehenshion, на данном этапе её должно быть достаточно.

Если хочется узнать подробнее, то всегда есть официальная документация.

→ Ссылка