← Все вопросы

Как найти второй по величине элемент в списке?

Задан 10 месяцев назад621 просмотров3 ответа
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, если нужны уникальные.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект