Как работает эта функция в пайтон?
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 шт):
В данном примере используется list comrehension (генератор списка).
Если развернуть его в привычный цикл, то это выглядит так:
less = []
for i in array[1:]:
if i<pivot:
less.append(i)
Соответсвенно:
iв начале генератора - это элемент, из котого собирается список;for i in array[1:]откуда этот элемент берется;if i<pivot- фильтрация элементов.
[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 (генераторы списков).
Позволяют создавать списки "на лету" по некоторому условию.
Как это работает:
- Всё записывается в квадратных скобках, по аналогии с тем, как создавать список.
- Далее указывается тот элемент, который будет помещен в итоговый список (в вашем случае - это элемент
i) - Далее определяется то, откуда этот элемент берется (
i for i in array[1:]), то есть в новый список будут добавлены все элементы изarray[1:], если бы например было написаноi**2 for i in array[1:], то добавлялись бы не сами элементы, а их квадраты. - И дополнительно можно ещё написать некоторое условие, по которому элементы будут добавляться в новый список,
if i > pivot
В заключение имеем, что мы получаем новый список из всех элементов array[1:], которые превосходят значение pivot.
Это базовая информация про list comprehenshion, на данном этапе её должно быть достаточно.
Если хочется узнать подробнее, то всегда есть официальная документация.