Вам интересно, как найти минимальное и максимальное значение в словаре 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.
- Понимание словаря.
Надеюсь, эта статья оказалась для вас полезной.
А теперь, что еще вы хотели бы узнать?
Дайте мне знать в комментариях ниже 🙂