Как вынести функции?

from collections import namedtuple


def quick_sort(array, comparator):  
    def _partition(array, left, right):
        pivot = left
        for student in range(left + 1, right + 1):
            if comparator(array[left], array[student]):
                pivot += 1
                array[student], array[pivot] = array[pivot], array[student]
        array[pivot], array[left] = array[left], array[pivot]
        return pivot

    def _quick_sort(array, low, high):
        if low < high:
            split_index = _partition(array, low, high)
            _quick_sort(array, low, split_index)
            _quick_sort(array, split_index + 1, high)
    _quick_sort(array, 0, len(array) - 1)


def comparator(member_first, member_second):
        if member_first.points < member_second.points:
            return True
        elif member_first.points > member_second.points:
            return False
        else:
            if member_first.penalties > member_second.penalties:
               return True
            elif member_first.penalties < member_second.penalties:
                return False
            else:
                if member_first.nickname > member_second.nickname:
                    return True
                else:
                    return False


if __name__ == '__main__':
   number_of_participants = int(input())
   students  =  [None] * number_of_participants
   Student = namedtuple('Student', 'nickname points penalties')
   for i in range(number_of_participants):
        try:
           nickname, points, penalties = input().split()
           students[i] = Student(nickname, int(points), int(penalties))
       except ValueError as error:
           raise ValueError(error)
   quick_sort(students, comparator)
   for student in students:
        print(student.nickname)

Было написано такое замечание: Лишняя внутренняя функция - весь код можно вынести в quick_sort - про def _partition

Подскажите пожалуйста как правильно вынести код в quick_sort?


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

Автор решения: Roman-Stop RU aggression in UA

Как-то так:

def _quick_sort(array, low, high, comparator):
    if low < high:
        pivot = low
        for student in range(low + 1, high + 1):
            if comparator(array[low], array[student]):
                pivot += 1
                array[student], array[pivot] = array[pivot], array[student]
        array[pivot], array[low] = array[low], array[pivot]
        _quick_sort(array, low, pivot, comparator)
        _quick_sort(array, pivot + 1, high, comparator)

def quick_sort(array, comparator):  
    _quick_sort(array, 0, len(array) - 1, comparator)

quick_sort и _quick_sort можно слить:

def quick_sort(array, comparator, low=None, high=None):
    low = low or 0
    high = high or len(array) - 1
    if low < high:
        pivot = low
        for student in range(low + 1, high + 1):
            if comparator(array[low], array[student]):
                pivot += 1
                array[student], array[pivot] = array[pivot], array[student]
        array[pivot], array[low] = array[low], array[pivot]
        quick_sort(array, comparator, low=low, high=pivot)
        quick_sort(array, comparator, low=pivot + 1, high=high)

→ Ссылка