Получить ключ, соответствующий минимальному значению в словаре - PullRequest
240 голосов
/ 19 июля 2010

Если у меня есть словарь Python, как мне получить ключ к записи, которая содержит минимальное значение?

Я думал о том, что делать с функцией min() ...

С учетом ввода:

{320:1, 321:0, 322:3}

Будет возвращено 321.

Ответы [ 15 ]

480 голосов
/ 19 июля 2010

Лучше: min(d, key=d.get) - нет причин вставлять бесполезный lambda слой косвенности или извлекать предметы или ключи!

41 голосов
/ 19 июля 2010

Вот ответ, который фактически дает решение, запрошенное ОП:

>>> d = {320:1, 321:0, 322:3}
>>> d.items()
[(320, 1), (321, 0), (322, 3)]
>>> # find the minimum by comparing the second element of each tuple
>>> min(d.items(), key=lambda x: x[1]) 
(321, 0)

Однако использование d.iteritems() будет более эффективным для больших словарей.

10 голосов
/ 19 июля 2010

min(d.items(), key=lambda x: x[1])[0]

6 голосов
/ 07 августа 2016

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

def minimums(some_dict):
    positions = [] # output variable
    min_value = float("inf")
    for k, v in some_dict.items():
        if v == min_value:
            positions.append(k)
        if v < min_value:
            min_value = v
            positions = [] # output variable
            positions.append(k)

    return positions

minimums({'a':1, 'b':2, 'c':-1, 'd':0, 'e':-1})

['e', 'c']
6 голосов
/ 19 июля 2010
>>> d = {320:1, 321:0, 322:3}
>>> min(d, key=lambda k: d[k]) 
321
4 голосов
/ 27 апреля 2018

Для нескольких клавиш, имеющих одинаковое наименьшее значение, вы можете использовать понимание списка:

d = {320:1, 321:0, 322:3, 323:0}

minval = min(d.values())
res = [k for k, v in d.items() if v==minval]

[321, 323]

Эквивалентная функциональная версия:

res = list(filter(lambda x: d[x]==minval, d))
4 голосов
/ 19 июля 2010

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

d = {320:1, 321:0, 322:3, 323:0}
print ', '.join(str(key) for min_value in (min(d.values()),) for key in d if d[key]==min_value)

"""Output:
321, 323
"""
3 голосов
/ 20 июля 2010

Другой подход к решению проблемы нескольких ключей с одинаковым значением min:

>>> dd = {320:1, 321:0, 322:3, 323:0}
>>>
>>> from itertools import groupby
>>> from operator import itemgetter
>>>
>>> print [v for k,v in groupby(sorted((v,k) for k,v in dd.iteritems()), key=itemgetter(0)).next()[1]]
[321, 323]
3 голосов
/ 19 июля 2010

Редактировать: это ответ на вопрос оригинала ОП о минимальном ключе, а не о минимальном.


Вы можете получить ключис помощью функции keys, и вы правы в использовании min, чтобы найти минимум этого списка.

2 голосов
/ 21 февраля 2015

Используйте min с итератором (для Python 3 используйте items вместо iteritems); вместо лямбды используйте оператор itemgetter от, который быстрее, чем лямбда.

from operator import itemgetter
min_key, _ = min(d.iteritems(), key=itemgetter(1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...