вывести два максимальных элемента списка без сортировки
Помогите написать функцию чтоб вывести два максимальных элемента списка. однострочным циклом без сортировки никак не получается
a = [2, 2, 3, -15, 2, -7, -12, 2, 3]
def m(list):
[x for i in list]
return x
Ответы (4 шт):
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)
;)
Кто там говорил, что в одну строчку не получится? Если ищем только разные элементы, то легко:
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). Ну и в целом это просто прикольные решения, не самые, конечно, быстрые.
>>> a = [2, 2, 3, -15, 2, -7, -12, 2, 3]
>>> a.pop(a.index(max(a))), a.pop(a.index(max(a)))
>>> (3, 3)
Если разрешены импорты, то можно использовать 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))