Как найти два максимальных числа в питоне

от admin

Получить второе по величине число в списке за линейное время

Я изучаю Python, и простые способы обработки списков представлены как преимущество. Иногда это так, но посмотрите на это:

Очень простой и быстрый способ получить второе по величине число из списка. За исключением того, что простая обработка списка помогает написать программу, которая дважды просматривает список, чтобы найти наибольшее, а затем второе место. Это также разрушительно — мне нужно две копии данных, если я хочу сохранить оригинал. Нам нужно:

Который проходит по списку только один раз, но не является кратким и понятным, как предыдущее решение.

Итак: есть ли способ, в таких случаях, чтобы иметь оба? Четкость первой версии, но единственная пробежка второй?

23 ответа

Поскольку у @OscarLopez и у меня разные мнения о том, что означает второй по величине, я опубликую код в соответствии с моей интерпретацией и в соответствии с первым алгоритмом, предоставленным спрашивающим.

(Примечание: здесь используется отрицательная бесконечность вместо None , поскольку None имеет разное поведение сортировки в Python 2 и 3 — см. Python — Найти второе наименьшее число; проверка количества элементов в numbers гарантирует, что отрицательная бесконечность не будет возвращена, когда фактический ответ не определен.)

Если максимум встречается несколько раз, он также может быть вторым по величине. Еще одна особенность этого подхода заключается в том, что он работает правильно, если в нем меньше двух элементов; тогда нет второго по величине.

Запуск тех же тестов:

Обновить

Я реструктурировал условия, чтобы кардинально улучшить производительность; почти на 100% в моем тестировании на случайные числа. Причина этого заключается в том, что в исходной версии elif всегда оценивался в вероятном случае, когда следующее число не является наибольшим в списке. Другими словами, практически для каждого числа в списке было сделано два сравнения, тогда как одного сравнения в основном достаточно — если число не больше второго по величине, оно также не больше самого большого.

Как правильно решить задачу по поиску двух максимальных чисел в списке?

Наткнулся на задачу: найти два максимальных из списка чисел и найти их сумму. Пришла только такая простая мысль:

Но в списке же могут быть и текстовые данные.
Как правильно и элегантно решить?

  • Вопрос задан более трёх лет назад
  • 7181 просмотр
  • Facebook
  • Вконтакте
  • Twitter

Вариант без сортировки:

  • Facebook
  • Вконтакте
  • Twitter

я так и не понял, зачем в ответах все очищают список от нечисловых данных. в задаче четко говорится: «найти два максимальных из списка чисел и найти их сумму». то, что данные могут быть нечисловыми, автор, похоже, откуда-то из головы взял.

Как найти второй максимум в списке из последовательности чисел?

Total Pusher's user avatar

Пожалуй эффективнее всего будет воспользоваться функцией heapq.nlargest():

MaxU - stand with Ukraine's user avatar

Можно написать функцию:

или же можно поступить хитро

E1mir's user avatar

функция set позволит создать множество отсортированных по возрастанию отличных друг от друга чисел, функция list позволит создать список и обратиться к предпоследнему (или -2) элементу.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Методы min() и max() в Python

max метод в Python

В этом руководстве мы собираемся понять использование методов min и max в Python. По сути, метод Python max() возвращает максимальное значение среди набора переданных значений или элементов переданного итеративного объекта.

Использование метода Python max()

Ниже приведен синтаксис использования метода Python max() для поиска наибольшего значения в итерируемом объекте.

  • iterable — это объект, содержащий значения, для которых необходимо найти наибольшее,
  • key определяет функцию упорядочивания с одним аргументом,
  • И значение по умолчанию — это значение по умолчанию, возвращаемое методом, если переданная итерация пуста.

Чтобы найти наибольшее среди двух или более значений, переданных в качестве аргументов,

  • arg1, arg2,…. argn — это n значений, среди которых метод max() вернет наибольшее значение.

Мы можем использовать метод max() по-разному, чтобы найти максимум или наибольшее значение данной итерации или для двух или более аргументов.

Давайте посмотрим, как метод работает с итерируемым объектом, двумя или более значениями, с указанной ключевой функцией и с несколькими итерационными объектами, переданными в качестве аргументов.

С итерируемым объектом

В приведенном ниже примере мы рассматриваем список с некоторыми значениями, для которого мы должны найти самый большой элемент. Внимательно посмотрите на приведенный ниже код.

Как мы видим, для приведенного выше кода мы инициализируем список list1 и напрямую передаем его методу max() со значением по умолчанию, равным 0. Функция возвращает 8, поскольку это наибольшее значение.

Читать:
Что такое степень точности интеграл

Если бы список был пуст, функция передала бы значение по умолчанию, равное 0.

Передача двух или более значений методу max()

Когда два или более значений передаются методу max() , он возвращает максимальное или самое большое из них всех. Эти аргументы могут быть целыми числами, значениями с плавающей запятой, символами или даже строками.

Получаем максимальное значение, 73.

С ключевой функцией

Как мы упоминали ранее, ключ — это однострочная функция упорядочивания, на основе которой должно быть найдено максимальное значение среди набора значений.

Например, если мы хотим найти кортеж из списка кортежей, который имеет наибольшее значение 2-го элемента. Давайте посмотрим, как мы можем это сделать.

Здесь f() — это определяемая пользователем функция, которая возвращает второй элемент переданного кортежа. Передача этой функции в качестве ключа методу max() гарантирует, что кортеж будет возвращен с самым большим 2-м элементом. В нашем примере это (6, 8, 4).

Передача нескольких итераций в качестве аргументов

Как мы заявляли ранее, метод Python max() может также возвращать в качестве аргументов наибольший из нескольких повторяемых элементов. Эти аргументы могут быть повторяемыми, например строка, символ, кортеж, список и т. д.

По умолчанию метод max() возвращает объект с максимальным нулевым элементом для списков, кортежей и т. д. А для строк он сравнивает первый символ каждой переданной строки.

Ниже мы взяли пример для кортежей. Внимательно посмотрите на код.

В этом примере три кортежа с некоторыми начальными значениями были напрямую переданы методу max() . Что возвращает кортеж с самым большим первым элементом, то есть (7, 37, 1).

Вывод

Помните, что если значение по умолчанию не установлено и в качестве аргументов функции max() передается пустая итерация, возникает ошибка ValueError.

Min() метод

По сути, метод Python min() возвращает минимальное значение среди набора переданных значений или элементов переданного итеративного объекта.

Общий синтаксис использования метода min() приведен ниже. Используя его, мы можем найти минимальное значение среди элементов итерации (список, кортеж, строка и т. д.).

А чтобы найти минимальное значение среди набора элементов, мы можем напрямую передать их все в функцию min() , разделив их запятыми («,»).

  • iterable содержит значения, для которых необходимо найти наименьшее,
  • key — это однострочная функция,
  • default — это значение по умолчанию, возвращаемое функцией, если переданная итерация пуста,
  • arg1, arg2,… argn — это набор значений, для которых функция min() вернет наименьшее значение.

1 С итерируемым объектом

Функция min() широко используется для поиска наименьшего значения, присутствующего в итерируемом объекте, таком как список, кортеж, список списков, список кортежей и т. д. В случае простых списков и кортежей она возвращает наименьшее значение, присутствующее в итерируемом объекте.

Посмотрите на пример, приведенный ниже.

Здесь передача списка list1 непосредственно методу min() дает нам минимум всех элементов, присутствующих в списке, то есть 23. Значение по default установлено на 0, так что, если переданный итерабельный объект был пустым, метод был бы вернули это значение по умолчанию (0).

Для списка символов метод min() возвращает элемент с минимальным значением ASCII.

2 С несколькими аргументами

Когда мы передаем несколько аргументов методу min() , он возвращает самый маленький из них.

Обратите внимание: мы можем передавать несколько значений, а также несколько итераций в метод min() . Для нескольких итераций метод возвращает элемент с наименьшим первым элементом (значение в 0-м индексе).

Пример ниже объясняет это легко:

В приведенном выше примере, когда мы передаем несколько значений в качестве аргументов методу min() , он просто возвращает нам наименьшее значение (434)

В то время как для list1, list2 и list3 он возвращает list3, поскольку он имеет минимальное 0-е значение индекса (19).

3 С ключевой функцией

Как мы упоминали ранее, ключевая функция — это однострочная функция упорядочивания, которая определяет, на основе какого параметра должен быть возвращен минимум.

Давайте рассмотрим пример, чтобы понять эту ключевую концепцию.

  • Сначала мы инициализируем список кортежей вместе с тремя другими целочисленными списками разной длины,
  • Затем мы определяем функцию ret_2nd_ele() которая возвращает 2-й элемент или 1-й элемент индекса переданного кортежа,
  • После этого мы передаем list_of_tuples методу min() с ret_2nd_ele() в качестве ключа,
  • Мы снова передаем три списка list1, list2 и list3 в качестве аргументов методу min() с ключом, установленным как встроенный метод len() .

Таким образом, мы получаем кортеж с минимальным 2-м элементом (1-м элементом) для списка кортежей. И список с минимальной длиной (с использованием len() ) из трех списков, то есть list1 .

Всегда помните, что передача пустой итерации без значения по умолчанию, установленного для метода min() , вызывает ValueError .

Похожие статьи