def sorting_two(A):
return tuple(sorted(A, reverse=True)[:2]) ❶
def double_two(A):
my_max = max(A) ❷
copy = list(A)
copy.remove(my_max) ❸
return (my_max, max(copy)) ❹
def mutable_two(A):
idx = max(range(len(A)), key=A.__getitem__) ❺
my_max = A[idx] ❻
del A[idx]
second = max(A) ❼
A.insert(idx, my_max) ❽
return (my_max, second)
❶ Создать из A новый отсортированный список и вернуть первые два его элемента.
❷ Использовать встроенную функцию max() и найти максимум.
❸ Создать дубликат списка A и удалить из него этот максимум.
❹ Вернуть кортеж из сходного максимума и максимума в урезанной копии.
❺ Трюк Python, который позволяет найти индекс наибольшего значения, а не само наибольшее значение.
❻ Запомнить максимум my_max и удалить его из A.
❼ Найти еще один max() в усеченном списке.
❽ Вставить максимальное значение my_max на место.
Трюк ❺ работает так. Как и все операции с объектами в Python, операция индексирования (то есть квадратные скобки) имеет эквивалентный ей метод — .__getitem__(). Параметр key=функция в функции max(последовательность) означает, что максимум будет вычисляться не в исходной последовательности элемент0, элемент1…, а в последовательности функция(элемент0), функция(элемент1)…, а в качестве результата функция вернет некоторый элементm. В нашем примере элементы — это 0, 1… m… len(A)-1, то есть индексы всех объектов в A, а максимум вычисляется среди A.__getitiem__(0), A.__getitiem__(1)…, то есть среди A[0], A[1]…, а возвращается при этом индекс m.