Как вынести функции?
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)