← Все вопросы
Как найти второй по величине элемент в списке?
11
Нужен второй максимум. Если просто отсортировать и взять [-2], то при дубликатах максимума он вернёт тот же максимум. Хочу именно второе по величине значение. Как правильно?
3 ответа
18
Зависит от того, что вы считаете «вторым». Если нужно второе уникальное значение — уберите дубликаты через множество:
nums = [5, 5, 4, 2]
second = sorted(set(nums))[-2]
print(second) # 4
Если же дубликаты максимума не мешают и нужен просто предпоследний по сортировке элемент — тогда sorted(nums)[-2]. Уточните постановку, иначе на тестах поймаете расхождение.
Евгений Казбан Именно из-за этой путаницы я и завалил задачу когда-то · 9 месяцев назад
7
Можно без полной сортировки за один проход: держим два «лидера».
first = second = float('-inf')
for x in nums:
if x > first:
first, second = x, first
elif first > x > second:
second = x
Это O(n) вместо O(n log n) — пригодится на больших данных.
2
heapq.nlargest(2, nums)[-1] — но он тоже не отсеивает дубликаты сам, так что сначала set, если нужны уникальные.
Ваш ответ
Войдите, чтобы ответить на вопрос.