Найти минимальное и максимальное значения в словаре Python

Вам интересно, как найти минимальное и максимальное значение в словаре Python? Здесь вы найдете ответы, которые ищете.

Самый простой способ найти минимальные или максимальные значения в словаре Python — использовать встроенные функции min() или max(), применяемые к списку, возвращаемому методом словаря values(). Вы также можете передать только словарь функциям max() или min(), но в этом случае вам придется использовать необязательный аргумент key для определения минимума или максимума на основе значений словаря, а не ключей.

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

Давайте начнем кодировать!

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

Предположим, что мы создали игру и сохраняем очки всех игроков в словаре.

>>> points = {'Jake': 100, 'Andy': 450, 'Kate': 230}

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

Python предоставляет встроенную функцию max(), которая возвращает наибольший элемент в итерируемом объекте.

Кроме того, одним из методов, предоставляемых словарями Python, является метод values(), который возвращает список всех значений в словаре.

>>> print(points.values)
<built-in method values of dict object at 0x7f9448181500>

Сначала давайте вызовем метод values() нашего словаря, чтобы посмотреть, что мы получим в ответ:

>>> print(points.values())
dict_values([100, 450, 230])

Затем попробуйте передать этот список функции max…

>>> print(max(points.values()))
450

Мы получили то, что хотели, — максимальное значение в словаре.

В следующем разделе мы увидим, как получить максимальное значение в словаре, а также отслеживать ключ, сопоставленный этому значению.

Получить максимальное значение и его ключ из словаря в Python

В предыдущем разделе мы увидели, что функцию Python max можно использовать с итерируемыми объектами.

Является ли словарь Python итерируемым?

Словарь Python является итерируемым, поскольку он имеет метод dunder, называемый __iter__. Для проверки всех методов, которые принадлежат словарю, вы можете использовать команду dir(dict).

>>> dir(dict)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

Вот что произойдет, если передать словарь точек, определенный в предыдущем разделе, функции max:

>>> max(points)
'Kate'

Функция max возвращает ключ с максимальным значением в словаре. В этом случае ключи сравниваются в алфавитном порядке.

Это не то, что нам нужно, учитывая, что мы хотим получить максимальное значение в словаре, а не максимальный ключ словаря.

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

Это тот же подход, который используется во встроенной функции сортировки.

Мы передаем points.get в качестве аргумента key, поэтому функция max проходит по всем ключам в словаре и получает максимум после вызова метода points.get() для каждого ключа (этот метод возвращает значение, связанное с заданным ключом).

>>> max(points, key=points.get)
'Andy'

Снова…

Мы передаем points.get в аргумент key, чтобы получить максимум на основе значений в словаре, а не на основе ключей.

На этот раз функция max возвращает ключ «Энди», поскольку этот ключ связан с наибольшим значением в словаре (450).

Чтобы получить фактическое значение, нам просто нужно извлечь значение, сопоставленное с ключом словаря, полученным с помощью предыдущего кода:

>>> print(points[max(points, key=points.get)])
450

А если мы хотим вывести и ключ, и максимальное значение, мы можем использовать следующий код…

>>> print("Key associated to the maximum value: {} - Maximum value: {}".format(max(points, key=points.get), points[max(points, key=points.get)]))
Key associated to the maximum value: Kate - Maximum value: 450

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

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

В предыдущих примерах в словаре было только одно максимальное значение.

Но что произойдет, если в предыдущем словаре у нас будет одно и то же максимальное значение, связанное с разными ключами?

Вот что я имею в виду…

>>> points = {'Jake': 100, 'Andy': 450, 'Kate': 450}

В этом случае у Энди и Кейт по 450 очков, и когда я использую код, созданный в предыдущем разделе, вот результат:

>>> print("Key associated to the maximum value: {} - Maximum value: {}".format(max(points, key=points.get), points[max(points, key=points.get)]))
Key associated to the maximum value: Andy - Maximum value: 450

Мы получаем только ключ «Энди», и это неверно.

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

Мы можем начать с максимального значения, а затем определить ключи, значение которых соответствует максимальному значению.

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

Давайте сначала вычислим максимальное значение и сохраним его в переменной max_value:

>>> max_value = max(points.values())

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

>>> {key:value for key, value in points.items() if value == max_value}
{'Andy': 450, 'Kate': 450}

Чтобы понять приведенное выше выражение понимания, вам необходимо вспомнить, что возвращает метод dictionary items().

>>> print(points.items())
dict_items([('Jake', 100), ('Andy', 450), ('Kate', 450)])

Теперь это имеет смысл?

При анализе словаря мы просматриваем каждый кортеж в списке и берем ключ и значение из кортежей, значение которых соответствует максимальному значению.

Как использовать функцию Python Max с лямбда-выражением

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

Примечание: при таком подходе мы предполагаем, что максимальное значение в нашем словаре может быть только одно.

Возьмем следующий словарь:

>>> points = {'Jake': 100, 'Andy': 450, 'Kate': 200}

Мы вычислим максимальный кортеж в списке, возвращаемом points.items().

>>> print(points.items())
dict_items([('Jake', 100), ('Andy', 450), ('Kate', 200)])

Вот результат, который мы получаем, просто применяя встроенную функцию max к списку кортежей выше…

>>> max(points.items())
('Kate', 200)

Хммм… это не то, что нам нужно…

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

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

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

Второй элемент в данном кортеже представляет значение в исходном словаре.

Лямбда-функция, которую мы передадим, это…

lambda data: data[1]

Вызов функции max становится следующим:

>>> max(points.items(), key = lambda data: data[1])
('Andy', 450)

Как видите, мы получаем правильную пару ключ/значение из словаря, исходя из того, что 450 — это максимальное значение.

Использование оператора itemgetter() с функцией Max для получения максимального значения в словаре

Есть еще один способ записи лямбда-функции, которую мы видели в предыдущем разделе:

lambda data: data[1]

Эту лямбда-функцию можно заменить функцией Operator.itemgetter(), которая является частью модуля Operator.

Передавая индекс 1 в Operator.itemgetter(), вы получаете второй элемент каждого кортежа в списке points.items().

>>> import operator
>>> max(points.items(), key = operator.itemgetter(1))
('Andy', 450)

Как видите, функция itemgetter используется в качестве ключевого аргумента для определения максимального значения в словаре.

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

>>> max(points.items(), key = operator.itemgetter(1))[1]
450

Другой способ найти максимальное значение словаря с помощью лямбда-функции и функции Max

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

В предыдущем разделе мы использовали лямбда-функцию для определения максимального второго элемента в каждом кортеже, возвращаемом points.items().

На этот раз мы будем работать с исходными точками словаря вместо points.items().

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

Лямбда-функция будет иметь вид:

lambda dict_key: points[dict_key]

Учитывая следующий словарь…

>>> points = {'Jake': 100, 'Andy': 450, 'Kate': 200}

Мы можем использовать функцию max, как показано ниже:

>>> max_value = max(points, key = lambda dict_key: points[dict_key])
>>> print(max_value)
Andy

Примечание: как и в предыдущем разделе, этот подход не работает, если нескольким ключам присвоено одно и то же максимальное значение.

Примечание 2: аргумент key функции max() не имеет ничего общего с key словаря. Чтобы прояснить это, я использовал dict_key в лямбда-функции.

Рассматривайте это как упражнение по практике использования словарей, лямбда-выражений и функции max.

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

Чтобы найти минимальное значение в словаре Python, можно использовать встроенную функцию min(), примененную к результату метода словаря values().

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

Давайте воспользуемся следующим словарем…

>>> points = {'Jake': 100, 'Andy': 450, 'Kate': 450}

А вот минимальное значение в словаре, рассчитанное с помощью функции min().

>>> min_value = min(points.values())
>>> print(min_value)
100

А теперь с помощью генератора словарей и оператора if мы можем создать словарь, содержащий все ключи, соответствующие минимальному значению.

>>> {key:value for key, value in points.items() if value == min_value}
{'Jake': 100}

Давайте проверим, что это также работает, если нескольким ключам сопоставлено минимальное значение.

>>> points = {'Jake': 100, 'Andy': 450, 'Kate': 450, 'Jeremy': 100}
>>> {key:value for key, value in points.items() if value == min_value}
{'Jake': 100, 'Jeremy': 100}

Оно работает!

Найдите максимальное значение в словаре Python, используя «обратный» словарь

Если вы думаете, что мы рассмотрели достаточно способов получения максимального или минимального значения в словаре, подумайте дважды 🙂

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

Начните со следующего словаря:

>>> points = {'Jake': 100, 'Andy': 450, 'Kate': 230}

Сейчас…

Я хочу поменять местами ключи и значения в словаре.

Скоро вы поймете почему…

Формат оригинального словаря:

{key1: value1, key2: value2,..., keyN: valueN}

Новый словарь будет:

{value1: key1, value2: key2,..., valueN: keyN}

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

Чтобы поменять местами ключи и значения в словаре, мы можем использовать генератор словаря.

>>> points_swapped = {value:key for key, value in points.items()}
>>> print(points_swapped)
{100: 'Jake', 450: 'Andy', 230: 'Kate'}

Прежде чем продолжить чтение, убедитесь, что вы поняли это.

Теперь мы можем использовать функцию max() с новым словарем, чтобы получить максимальное значение в словаре.

>>> print(max(points_swapped))
450

То же самое относится к функции min(), которая возвращает минимальное значение в словаре:

>>> print(min(points_swapped))
100

Заключение

Ого, мы увидели множество разных способов извлечения максимальных и минимальных значений из словаря Python.

Это была прекрасная возможность рассмотреть такие концепции Python, как:

  • Встроенные функции (мин/макс) с необязательным ключевым аргументом и без него.
  • Методы словаря: dict.values() и dict.items().
  • Лямбда-функции.
  • Функция itemgetter модуля оператора Python.
  • Понимание словаря.

Надеюсь, эта статья оказалась для вас полезной.

А теперь, что еще вы хотели бы узнать?

Дайте мне знать в комментариях ниже 🙂

Автор

Фото аватара

Владимир Михайлов

Программист на Python с большим количеством опыта и разнообразных проектов.