Рубрики
Без рубрики

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

Никакая библиотека – используйте максимальную функцию с клавишным аргументом: *** MAX (DIC, .get) ***

Автор оригинала: Chris.

Я провел утренние часы на важной миссии. Что такое самый чистый, самый быстрый и самый краткий ответ на следующий вопрос: как вы находите ключ с минимальным значением в словаре Python? Большинство ответов на Интернете говорят, что вам нужно использовать библиотеку, но это не правда!

Просто используйте минимальную функцию с клавишным аргументом, установленным на Dict.get :

income = {'Anne' : 1111,
          'Bert' : 2222,
          'Cara' : 9999999}

print(min(income, key=income.get))
# Anne

Минимальная функция переходит на все ключи, к в словаре доходов и принимает минимальное значение после применения доход. Получить (k) метод. Получить () Метод возвращает значение, указанное для ключа, к в словаре.

Играйте с этим сами в нашем интерактивном коде Shell:

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

Что такое минимальная функция в Python?

Скорее всего, вы уже знаете функцию Python Min (…). Вы можете использовать его, чтобы найти минимальное значение любого намерения или любого количества значений. Вот несколько примеров, использующих минимальную функцию, не указав какие-либо дополнительные аргументы.

income = {'Anne' : 1111,
          'Bert' : 2222,
          'Cara' : 9999999}

print(min(income, key=income.get))
# Anne

# Key that starts with 'smallest' letter of the alphabet
print(min(income))
# Anne

# Smallest value in the dictionary income
print(min(income.values()))
# 1111

# Smallest value in the given list
print(min([1,4,7,5,3,99,3]))
# 1

# Compare lists element-wise, min is first list to have a larger
# element 
print(min([1,2,3],[5,6,4]))
# [1, 2, 3]

# Smallest value in the given sequence of numbers
print(min(5,7,99,88,123))
# 5

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

Теперь давайте посмотрим на необязательные аргументы минимальной функции. Один из них – «ключ» Отказ Давайте узнаем, что это делает.

Как Ключевым аргументом работы Python Min () работает?

Последние примеры показывают интуитивные разработки минимальной функции: вы проходите один или несколько повторных документов в качестве позиционных аргументов.

Intermezzo : Что такое иеристы? Итализатор является объектом, из которого вы можете получить итератор. ITERATOR – это объект, на котором вы можете позвонить следующему () методу. Каждый раз, когда вы звоните следующим (), вы получаете «следующий» элемент, пока не получите все элементы из итератора. Например, Python использует итераторы для петлей, чтобы пройти все элементы списка, все символы строки или все клавиши в словаре.

Когда вы указываете клавишный аргумент, определите функцию, которая возвращает значение для каждого элемента Iterable. Тогда каждый элемент сравнивается на основе возвращаемого значения этой функции, а не указанным элементом (поведение по умолчанию).

Вот пример:

lst = [2, 4, 8, 16]

def inverse(val):
   return -val

print(min(lst))
# 2

print(min(lst, key=inverse))
# 16

Мы определяем функцию обратная () Это возвращает значение, умноженное на -1. Теперь мы печатаем два исполнения мин () функция.

  • Первый – это выполнение по умолчанию: минимум списка [2, 4, 8, 16] 2.
  • Второй использует ключ. Мы указываем обратная в качестве ключевой функции. Python применяет эту функцию ко всем значениям [2, 4, 8, 16] . Это сравнивает эти новые значения друг с другом и возвращает мин. Использование обратной функции Python делает следующие сопоставления:
Оригинальное значение Значение после обратного () (основа для мин ())
2 -2
4 -4
8 -8
16 -16

Python рассчитывает минимальный на основе этих отображений. В этом случае значение 16 (с сопоставлением -16) является минимальным значением, потому что -2> -4> -8> -16.

Теперь давайте вернемся к начальному вопросу:

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

Мы используем тот же пример, что и выше. Словарь хранит доход от трех человек Иоанна, Мэри и Алиса. Предположим, вы хотите найти человека с наименьшим доходом. Другими словами, каков ключ с минимальным значением в словаре?

Теперь не путайте ключ словаря с дополнительным клавишным аргументом мин () функция. У них ничего общего нет – это просто несчастное совпадение, которое у них есть то же имя!

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

Чтобы узнать больше о словарях, ознакомьтесь с нашей статьей Python словарь – окончательное руководство.

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

Чтобы получить значение «Анна» мы можем использовать нотацию кронштейна – Доход ['Anne'] . Но нотация кронштейна не является функцией, так что не работает. К счастью, доход. Получить ('anne') делает (почти) так же, как Доход ['Anne'] И это функция! Единственное отличие в том, что он возвращает Нет Если они ключ нет в словаре. Итак, мы передадим это к ключевому аргументу мин () Отказ

income = {'Anne' : 1111,
          'Bert' : 2222,
          'Cara' : 9999999}

print(min(income, key=income.get))
# Anne

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

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

income = {'Anne' : 1111,
          'Bert' : 2222,
          'Cara' : 9999999}

print(max(income, key=income.get))
# Cara

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

Связанная статья:

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

Найдите ключ с минимальным значением в словаре – альтернативные методы

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

В оформлении Ответ в Stackoverflow , пользователь по сравнению с девятью (!) различными способами найти ключ с минимальным значением в словаре. Они здесь:

income = {'Anne' : 11111,
          'Bert' : 2222,
          'Cara' : 9999999}

# Convert to lists and use .index(max())
def f1(): 
    v=list(income.values())
    k=list(income.keys())
    return k[v.index(min(v))]

# Dictionary comprehension to swap keys and values
def f2():
   d3={v:k for k,v in income.items()}
   return d3[min(d3)]

# Use filter() and a lambda function
def f3():
   return list(filter(lambda t: t[1]==min(income.values()), income.items()))[0][0]   

# Same as f3() but more explicit
def f4():
   m=min(income.values())
   return list(filter(lambda t: t[1]==m, income.items()))[0][0] 
      
# List comprehension
def f5():
   return [k for k,v in income.items() if v==min(income.values())][0]  
 
# same as f5 but remove the max from the comprehension
def f6():
   m=min(income.values())
   return [k for k,v in income.items() if v==m][0]   
    
# Method used in this article
def f7():
   return min(income,key=income.get)    

# Similar to f1() but shortened to 2 lines
def f8():
    v=list(income.values())
    return list(income.keys())[v.index(min(v))] 
  
# Similar to f7() but use a lambda function
def f9():
    return min(income, key=lambda k: income[k])    

print(f1())
print(f2())
print(f3())
print(f4())
print(f5())
print(f6())
print(f7())
print(f8())
print(f9())
# Bert (all outputs)

В оформлении ориентир Выполненные в большом словаре пользователя Stackoverflow, F1 () оказался самым быстрым.

Таким образом, второй лучший способ получить ключ с минимальным значением из словаря:

income = {'Anne' : 11111,
          'Bert' : 2222,
          'Cara' : 9999999}

v=list(income.values())
k=list(income.keys())
print(k[v.index(min(v))])
# Bert

Найти ключ с кратчайшим значением в словаре

Мы знаем, как найти минимальное значение, если значения являются номерами. Как насчет ли они списков или строки?

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

days_worked = {'Anne': [1, 1, 1, 1],
               'Bert': [1, 1, 1, 1, 1, 1],
               'Cara': [1, 1, 1, 1, 1, 1, 1, 1]}

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

# Length 2 is less than length 4
>>> [1, 1] < [1, 1, 1, 1]
True

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

>>> min(days_worked, key=days_worked.get)
'Anne'

Если мы обновим наш словарь, так что Bert работал в большинстве дней и подать заявку мин () Опять же, Python возвращает «Анна» Отказ

>>> days_worked = {'Anne': [1, 1, 1, 1],
                   'Bert': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                   'Cara': [1, 1, 1, 1, 1, 1, 1, 1]}

# Anne has now worked the least
>>> min(days_worked, key=days_worked.get)

Найти ключ с минимальным значением в списке словарей

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

income1 = {'Anne': 1111,
           'Bert': 2222,
           'Cara': 3333}

income2 = {'Dani': 4444,
           'Ella': 5555,
           'Fred': 6666}

income3 = {'Greg': 7777,
           'Hope': 8888,
           'Igor': 999999999999}

list_of_dicts = [income1, income2, income3]

Мы можем видеть, что «Анна» имеет самый низкий доход, поэтому мы ожидаем, что его возвращено.

Есть несколько способов сделать это. Самое простое состоит в том, чтобы поставить все пары клавишных пар в один словарь с использованием контура для цикла. Тогда мы называем мин () как обычно.

# Initialise empty dict
>>> big_dict = {}

# Use for loop and .update() method to add the key-value pairs
>>> for dic in list_of_dicts:
        big_dict.update(dic)

# Check the result is as expected
>>> big_dict
{'Anne': 1111,
'Bert': 2222,
'Cara': 3333,
'Dani': 4444,
'Ella': 5555,
'Fred': 6666,
'Greg': 7777,
'Hope': 8888,
'Igor': 999999999999}

# Call min() and specify key argument
>>> min(big_dict, key=big_dict.get)
'Anne' 

Куда пойти отсюда?

Каждый мастер Python должен знать основы. Улучшение вашего базового кодового понимания навыков на 20% улучшит вашу производительность намного больше всего на свете. Почему? Потому что все остальное основывается на основах.

Но большинство материальных онлайн утомительно и скучно. Вот почему я написал новый и захватывающий способ изучения Python, при этом измеряя и сравнивая свои навыки против других кодеров. Проверьте книгу «Кофе-брейк Python». Это LeanPub 2019 Bestseller в категории Python!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

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