вывести два максимальных элемента списка без сортировки

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

a = [2, 2, 3, -15, 2, -7, -12, 2, 3] 
def m(list):
    [x for i in list]
    return x

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

Автор решения: Victor VosMottor
a = [2, 2, 3, -15, 2, -7, -12, 2, 3] 
def two_max(lst):
    first = max(lst)
    second = max(i for i in lst if i != first)
    return first, second

two_max(a)
(3, 2)

;)

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

Кто там говорил, что в одну строчку не получится? Если ищем только разные элементы, то легко:

a = [2, 2, 3, -15, 2, -7, -12, 2, 3] 
print(max(a), max(x for x in a if x != max(a)))

Вывод:

3 2

Или ещё вариант с фильтром вместо списочного включения:

print(max(a), max(filter(lambda x: x != max(a), a)))

P.S. Я потестировал скорость, в общем, лучше прямо вот так как я написал не делать, а вынести max(a) в отдельную переменную и в однострочнике использовать уже эту переменную, а не дёргать всё время на сравнениях max(a). Ну и в целом это просто прикольные решения, не самые, конечно, быстрые.

→ Ссылка
Автор решения: Serhii Khortiuk
>>> a = [2, 2, 3, -15, 2, -7, -12, 2, 3]
>>> a.pop(a.index(max(a))), a.pop(a.index(max(a)))
>>> (3, 3)
→ Ссылка
Автор решения: Stanislav Volodarskiy

Если разрешены импорты, то можно использовать functools.reduce. На каждом шаге вычисляется пара максимальных значений:

import functools

a = [2, 2, 3, -15, 2, -7, -12, 2, 3]
print(functools.reduce(lambda x, y: sorted(x + [y])[-2:], a, []))

Хотя, если импорты разрешены, то есть специализированное решение:

import heapq

a = [2, 2, 3, -15, 2, -7, -12, 2, 3]
print(heapq.nlargest(2, a))
→ Ссылка