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

У меня dictionary: ключи - строки, значения - целые числа.

Пример:

stats = {'a':1000, 'b':3000, 'c': 100}

Я бы хотел получить 'b' в качестве ответа, так как это ключ с более высоким значением.

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

inverse = [(value, key) for key, value in stats.items()]
print max(inverse)[1]

Это лучший (или даже более элегантный) подход?


person ricafeal    schedule 06.11.2008    source источник
comment
Гм, что не так с max(stats)?   -  person John Red    schedule 13.12.2017
comment
max(stats) будет использовать метки в качестве ключей (он вернет 'c', учитывая, что это максимальная метка), max(stats, key=lambda key: stats[key]) - это то, что было после OP (которое вернет 'b', метку максимального индексированного значения). Это яснее?   -  person Atcold    schedule 06.01.2018


Ответы (25)


Для этого можно использовать operator.itemgetter:

import operator
stats = {'a':1000, 'b':3000, 'c': 100}
max(stats.iteritems(), key=operator.itemgetter(1))[0]

И вместо построения нового списка в памяти используйте stats.iteritems(). Параметр key функции max() - это функция, которая вычисляет ключ, который используется для определения ранжирования элементов.

Обратите внимание, что если бы у вас была другая пара "ключ-значение" d: 3000, этот метод вернет только одну из двух, даже если они обе имеют максимальное значение. .

>>> import operator
>>> stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000}
>>> max(stats.iteritems(), key=operator.itemgetter(1))[0]
'b' 

При использовании Python3:

>>> max(stats.items(), key=operator.itemgetter(1))[0]
'b'
person Community    schedule 06.11.2008
comment
Я думаю, даже чище = max(stats.iterkeys(), key=(lambda key: stats[key])) - person Lucretiel; 16.12.2012
comment
Почему бы просто не использовать key=lambda x: x[1]? - person BenDundee; 24.01.2014
comment
в python 3 @ Lucretiel (правильно написанное) решение не работает. он должен быть: max (stats.keys (), key = (lambda k: stats [k])), поскольку теперь keys () автоматически выполняет то же, что и iterkeys (). - person watsonic; 05.05.2015
comment
Вы правы. Интересно, что решение, которое эффективно использует память и работает как в Python 2, так и в Python 3: max(stats, key=lambda key: stats[key]) - person Lucretiel; 06.05.2015
comment
Честно говоря, я думаю, что комментарии имеют более четкое и лучшее решение. - person Augusto Gonzalez; 19.09.2019
comment
max(d.items(), key=operator.itemgetter(1))[0] для python3. - person Philippe Remy; 04.10.2019
comment
Я получаю следующее исключение, пытаясь это сделать: объект int не вызывается stats = {'a': 1000, 'b': 3000, 'c': 100, 'd': 3000} print (max (stats, key = лямбда-ключ: статистика [ключ])) - person MPL; 12.07.2020
comment
@BenDundee: использование лямбда вместо operator.itemgetter значительно медленнее, но функционально эквивалентно. - person Endlisnis; 16.03.2021
comment
this method will only return one of the two Это случайно? Какие критерии? - person ihavenoidea; 06.05.2021

Я протестировал МНОГО вариантов, и это самый быстрый способ вернуть ключ dict с максимальным значением:

def keywithmaxval(d):
     """ a) create a list of the dict's keys and values; 
         b) return the key with the max value"""  
     v=list(d.values())
     k=list(d.keys())
     return k[v.index(max(v))]

Чтобы дать вам представление, вот несколько возможных методов:

def f1():  
     v=list(d1.values())
     k=list(d1.keys())
     return k[v.index(max(v))]

def f2():
    d3={v:k for k,v in d1.items()}
    return d3[max(d3)]

def f3():
    return list(filter(lambda t: t[1]==max(d1.values()), d1.items()))[0][0]    

def f3b():
    # same as f3 but remove the call to max from the lambda
    m=max(d1.values())
    return list(filter(lambda t: t[1]==m, d1.items()))[0][0]        

def f4():
    return [k for k,v in d1.items() if v==max(d1.values())][0]    

def f4b():
    # same as f4 but remove the max from the comprehension
    m=max(d1.values())
    return [k for k,v in d1.items() if v==m][0]        

def f5():
    return max(d1.items(), key=operator.itemgetter(1))[0]    

def f6():
    return max(d1,key=d1.get)     

def f7():
     """ a) create a list of the dict's keys and values; 
         b) return the key with the max value"""    
     v=list(d1.values())
     return list(d1.keys())[v.index(max(v))]    

def f8():
     return max(d1, key=lambda k: d1[k])     

tl=[f1,f2, f3b, f4b, f5, f6, f7, f8, f4,f3]     
cmpthese.cmpthese(tl,c=100) 

Тестовый словарь:

d1={1: 1, 2: 2, 3: 8, 4: 3, 5: 6, 6: 9, 7: 17, 8: 4, 9: 20, 10: 7, 11: 15, 
    12: 10, 13: 10, 14: 18, 15: 18, 16: 5, 17: 13, 18: 21, 19: 21, 20: 8, 
    21: 8, 22: 16, 23: 16, 24: 11, 25: 24, 26: 11, 27: 112, 28: 19, 29: 19, 
    30: 19, 3077: 36, 32: 6, 33: 27, 34: 14, 35: 14, 36: 22, 4102: 39, 38: 22, 
    39: 35, 40: 9, 41: 110, 42: 9, 43: 30, 44: 17, 45: 17, 46: 17, 47: 105, 48: 12, 
    49: 25, 50: 25, 51: 25, 52: 12, 53: 12, 54: 113, 1079: 50, 56: 20, 57: 33, 
    58: 20, 59: 33, 60: 20, 61: 20, 62: 108, 63: 108, 64: 7, 65: 28, 66: 28, 67: 28, 
    68: 15, 69: 15, 70: 15, 71: 103, 72: 23, 73: 116, 74: 23, 75: 15, 76: 23, 77: 23, 
    78: 36, 79: 36, 80: 10, 81: 23, 82: 111, 83: 111, 84: 10, 85: 10, 86: 31, 87: 31, 
    88: 18, 89: 31, 90: 18, 91: 93, 92: 18, 93: 18, 94: 106, 95: 106, 96: 13, 9232: 35, 
    98: 26, 99: 26, 100: 26, 101: 26, 103: 88, 104: 13, 106: 13, 107: 101, 1132: 63, 
    2158: 51, 112: 21, 113: 13, 116: 21, 118: 34, 119: 34, 7288: 45, 121: 96, 122: 21, 
    124: 109, 125: 109, 128: 8, 1154: 32, 131: 29, 134: 29, 136: 16, 137: 91, 140: 16, 
    142: 104, 143: 104, 146: 117, 148: 24, 149: 24, 152: 24, 154: 24, 155: 86, 160: 11, 
    161: 99, 1186: 76, 3238: 49, 167: 68, 170: 11, 172: 32, 175: 81, 178: 32, 179: 32, 
    182: 94, 184: 19, 31: 107, 188: 107, 190: 107, 196: 27, 197: 27, 202: 27, 206: 89, 
    208: 14, 214: 102, 215: 102, 220: 115, 37: 22, 224: 22, 226: 14, 232: 22, 233: 84, 
    238: 35, 242: 97, 244: 22, 250: 110, 251: 66, 1276: 58, 256: 9, 2308: 33, 262: 30, 
    263: 79, 268: 30, 269: 30, 274: 92, 1300: 27, 280: 17, 283: 61, 286: 105, 292: 118, 
    296: 25, 298: 25, 304: 25, 310: 87, 1336: 71, 319: 56, 322: 100, 323: 100, 325: 25, 
    55: 113, 334: 69, 340: 12, 1367: 40, 350: 82, 358: 33, 364: 95, 376: 108, 
    377: 64, 2429: 46, 394: 28, 395: 77, 404: 28, 412: 90, 1438: 53, 425: 59, 430: 103, 
    1456: 97, 433: 28, 445: 72, 448: 23, 466: 85, 479: 54, 484: 98, 485: 98, 488: 23, 
    6154: 37, 502: 67, 4616: 34, 526: 80, 538: 31, 566: 62, 3644: 44, 577: 31, 97: 119, 
    592: 26, 593: 75, 1619: 48, 638: 57, 646: 101, 650: 26, 110: 114, 668: 70, 2734: 41, 
    700: 83, 1732: 30, 719: 52, 728: 96, 754: 65, 1780: 74, 4858: 47, 130: 29, 790: 78, 
    1822: 43, 2051: 38, 808: 29, 850: 60, 866: 29, 890: 73, 911: 42, 958: 55, 970: 99, 
    976: 24, 166: 112}

И результаты тестов под Python 3.2:

    rate/sec       f4      f3    f3b     f8     f5     f2    f4b     f6     f7     f1
f4       454       --   -2.5% -96.9% -97.5% -98.6% -98.6% -98.7% -98.7% -98.9% -99.0%
f3       466     2.6%      -- -96.8% -97.4% -98.6% -98.6% -98.6% -98.7% -98.9% -99.0%
f3b   14,715  3138.9% 3057.4%     -- -18.6% -55.5% -56.0% -56.4% -58.3% -63.8% -68.4%
f8    18,070  3877.3% 3777.3%  22.8%     -- -45.4% -45.9% -46.5% -48.8% -55.5% -61.2%
f5    33,091  7183.7% 7000.5% 124.9%  83.1%     --  -1.0%  -2.0%  -6.3% -18.6% -29.0%
f2    33,423  7256.8% 7071.8% 127.1%  85.0%   1.0%     --  -1.0%  -5.3% -17.7% -28.3%
f4b   33,762  7331.4% 7144.6% 129.4%  86.8%   2.0%   1.0%     --  -4.4% -16.9% -27.5%
f6    35,300  7669.8% 7474.4% 139.9%  95.4%   6.7%   5.6%   4.6%     -- -13.1% -24.2%
f7    40,631  8843.2% 8618.3% 176.1% 124.9%  22.8%  21.6%  20.3%  15.1%     -- -12.8%
f1    46,598 10156.7% 9898.8% 216.7% 157.9%  40.8%  39.4%  38.0%  32.0%  14.7%     --

И под Python 2.7:

    rate/sec       f3       f4     f8    f3b     f6     f5     f2    f4b     f7     f1
f3       384       --    -2.6% -97.1% -97.2% -97.9% -97.9% -98.0% -98.2% -98.5% -99.2%
f4       394     2.6%       -- -97.0% -97.2% -97.8% -97.9% -98.0% -98.1% -98.5% -99.1%
f8    13,079  3303.3%  3216.1%     --  -5.6% -28.6% -29.9% -32.8% -38.3% -49.7% -71.2%
f3b   13,852  3504.5%  3412.1%   5.9%     -- -24.4% -25.8% -28.9% -34.6% -46.7% -69.5%
f6    18,325  4668.4%  4546.2%  40.1%  32.3%     --  -1.8%  -5.9% -13.5% -29.5% -59.6%
f5    18,664  4756.5%  4632.0%  42.7%  34.7%   1.8%     --  -4.1% -11.9% -28.2% -58.8%
f2    19,470  4966.4%  4836.5%  48.9%  40.6%   6.2%   4.3%     --  -8.1% -25.1% -57.1%
f4b   21,187  5413.0%  5271.7%  62.0%  52.9%  15.6%  13.5%   8.8%     -- -18.5% -53.3%
f7    26,002  6665.8%  6492.4%  98.8%  87.7%  41.9%  39.3%  33.5%  22.7%     -- -42.7%
f1    45,354 11701.5% 11399.0% 246.8% 227.4% 147.5% 143.0% 132.9% 114.1%  74.4%     -- 

Вы можете видеть, что f1 является самым быстрым в Python 3.2 и 2.7 (или, точнее, keywithmaxval в верхней части этого сообщения)

person the wolf    schedule 09.09.2012
comment
Это кажется подозрительным. f7 похож на f1, просто не дает имени промежуточному объекту. f7 должен быть (очень немного) быстрее, чем f1, но не намного медленнее. И вот что я получаю: >>> timeit.timeit("f1()","from __main__ import f1, f7, d1", number=10000) 0.26785888786807277 >>> timeit.timeit("f7()","from __main__ import f1, f7, d1", number=10000) 0.26770628307832567 - person Reinstate Monica; 22.11.2012
comment
согласен, f1 похожа на f7. Сделал тест с ipython% timeit, и оба показали одинаковую производительность на моей машине на python 2.7. Тестирование: f1 - 18 мкс на цикл Тестирование: f2 - 33,7 мкс на цикл Тестирование: f3b - 50 мкс на цикл Тестирование: f4b - 30,7 мкс на цикл Тестирование: f5 - 28 мкс на цикл Тестирование: f6 - 23 мкс на цикл Тестирование: f7 - 18 мкс на петлю Тестирование: f8 - 43,9 мкс на петлю Тестирование: f4 - 2,16 мс на петлю Тестирование: f3 - 2,29 мс на петлю - person Joop; 17.09.2014
comment
f1 также применимо везде, где max (d, key) недоступен. - person Nikos Alexandris; 25.03.2015
comment
Я думал, что dict не отсортирован, теоретически нельзя ли заказать d.keys и d.values ​​по-другому? - person Dimath; 01.04.2015
comment
Решения для копирования списков мне неприятны. Как производительность на диктофоне с тысячами или миллионами записей? - person Lucretiel; 29.09.2015
comment
@the_wolf, я понимаю, что кортежи быстрее списков в Python (это одно из их преимуществ) - person Nick_F; 18.12.2016
comment
@Dimath, ты прав. Вот что со мной происходит. - person Neo Ravi; 13.05.2018
comment
не имеет значения. они все О (нлогн) - person Max Eisenhardt; 12.11.2018
comment
@DonaldAllen Но некоторые из них O (n) :) - person rosstex; 03.01.2019

Вы можете использовать:

max(d, key = d.get) 
# which is equivalent to 
max(d, key = lambda k : d.get(k))

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

max(d.items(), key = lambda k : k[1])
person pk786    schedule 14.02.2020
comment
Это должен быть принятый ответ, это намного проще, чем использовать оператор - person Sigmatics; 23.02.2020
comment
Какова временная сложность этого? - person music2177; 26.07.2020
comment
Безусловно, лучший ответ: для объяснения d.items() создает кортеж, а лямбда-функция использует значение кортежа в качестве объекта для оценки вместо ключа. - person Daniel Diaz; 18.01.2021
comment
это лучший / простой ответ из всего перечисленного. - person Koroslak; 18.01.2021

Если вам нужно знать только ключ с максимальным значением, вы можете сделать это без iterkeys или iteritems, потому что итерация по словарю в Python - это итерация по его ключам.

max_key = max(stats, key=lambda k: stats[k])

РЕДАКТИРОВАТЬ:

Из комментариев, @ user1274878:

Я новичок в питоне. Не могли бы вы объяснить свой ответ по шагам?

Ага...

Максимум

max (итерабельность [, ключ])

max (arg1, arg2, * args [, ключ])

Возвращает наибольший элемент в итерируемом объекте или наибольший из двух или более аргументов.

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

lambda <item>: return <a result of operation with item> 

Возвращенные значения будут сравниваться.

Диктовать

Python dict - это хеш-таблица. Ключ dict - это хеш объекта, объявленного как ключ. По причинам производительности итерация, хотя dict реализована как итерация по его ключам.

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

Закрытие

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

Переменная stats доступна через атрибут __closure__ функции lambda как указатель на значение переменной, определенной в родительской области.

person I159    schedule 07.02.2016
comment
@ I159: Я новичок в Python. Не могли бы вы объяснить свой ответ по шагам - person user1274878; 30.03.2017

Пример:

stats = {'a':1000, 'b':3000, 'c': 100}

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

max(stats, key=stats.get)

вывод - это ключ с максимальным значением.

person leo022    schedule 23.08.2018
comment
это решение протестировано быстрее, чем max (stats, key = lambda key: stats [key]) - person Ta946; 09.03.2019

Вот еще один:

stats = {'a':1000, 'b':3000, 'c': 100}
max(stats.iterkeys(), key=lambda k: stats[k])

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

person Community    schedule 06.11.2008
comment
.iterkeys не нужен в вашем ответе (это значение по умолчанию при повторении dict). Однако обратите внимание, что метод .iteritems извлекает и ключ, и значение за один шаг, поэтому нет необходимости в дополнительном getitem для каждого ключа, необходимого для .iterkeys. - person tzot; 06.11.2008
comment
Это отличный ответ, потому что очень ясно, что происходит, и поэтому его легко распространить на другие ситуации. - person Leopd; 26.04.2013
comment
в версии python3: max(stats, key=lambda k: stats[k]) - person OfirD; 14.02.2020

key, value = max(stats.iteritems(), key=lambda x:x[1])

Если вас не волнует ценность (я был бы удивлен, но), вы можете:

key, _ = max(stats.iteritems(), key=lambda x:x[1])

Мне нравится распаковка кортежа больше, чем индекс [0] в конце выражения. Мне никогда не очень нравилась удобочитаемость лямбда-выражений, но я считаю это лучше, чем operator.itemgetter (1) ИМХО.

person Tim Ottinger    schedule 07.11.2008
comment
_ можно использовать вместо ignored. - person jfs; 12.11.2008
comment
@ J.F.Sebastian Я согласен, что ignored выглядит довольно некрасиво, но некоторые люди против использования _ по нескольким причинам. Я думаю, что первый фрагмент подойдет, даже если вы проигнорируете значение - person jamylak; 11.04.2013

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

>>> stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000}
>>> [key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m]
['b', 'd']

Это даст вам «b» и любой другой максимальный ключ.

Примечание: для python 3 используйте stats.items() вместо stats.iteritems()

person Climbs_lika_Spyder    schedule 02.05.2014
comment
Ваше решение в порядке, но максимальное значение вычисляется столько раз, сколько есть элементов в dict. Если бы вычисления max были дорогими (например, ДЛИННЫЙ словарь), я бы порекомендовал [key for m in [max(stats.values())] for key,val in stats.iteritems() if val == m], если вы хотите однострочник, в противном случае вычислите m = ... заранее. - person gboffi; 03.12.2014
comment
Небольшое примечание: для python 3 используйте stats.items () вместо stats.iteritems (). - person Susa; 04.08.2018

Чтобы получить максимальный ключ / значение словаря stats:

stats = {'a':1000, 'b':3000, 'c': 100}
  • На основе ключей

>>> max(stats.items(), key = lambda x: x[0]) ('c', 100)

  • На основе значений

>>> max(stats.items(), key = lambda x: x[1]) ('b', 3000)

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

>>> max(stats.items(), key = lambda x: x[1])[0] 'b'

Объяснение

Метод словаря items() в Python 3 возвращает объект просмотра словаря. Когда этот объект представления повторяется функцией max, он выдает элементы словаря в виде кортежей формы (key, value).

>>> list(stats.items()) [('c', 100), ('b', 3000), ('a', 1000)]

При использовании выражения lambda lambda x: x[1] на каждой итерации x равно одному из этих кортежей (key, value). Итак, выбирая правильный индекс, вы выбираете, хотите ли вы сравнивать по ключам или по значениям.

Python 2

Для версий Python 2.2+ будет работать тот же код. Однако лучше использовать метод словаря iteritems() вместо _ 15_ для повышения производительности.

Примечания

  • Этот ответ основан на комментариях к ответу Climbs_lika_Spyder.

  • Используемый код был протестирован на Python 3.5.2 и Python 2.7.10.

person Karim Sonbol    schedule 17.12.2017

max(stats, key=stats.get) if stats else None

stats может быть пустым словарем, поэтому использование только max(stats, key=stats.get) приведет к поломке в этой ситуации.

person Bhindi    schedule 04.09.2020
comment
отличный ответ! Самая простая вещь, которую я мог представить. - person Michael Tamillow; 20.01.2021
comment
Есть идеи, какова временная сложность этого? - person RaGe; 12.06.2021
comment
@RaGe Временная сложность O (n) - person Bhindi; 22.06.2021

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

def keys_with_top_values(my_dict):
    return [key  for (key, value) in my_dict.items() if value == max(my_dict.values())]

Отправка этого ответа на случай, если он кому-то поможет. См. Ниже сообщение SO

Какой максимум выбирает Python в случае галстук?

person kslote1    schedule 19.08.2019

Для повторных решений через комментарии в выбранном ответе ...

В Python 3:

max(stats.keys(), key=(lambda k: stats[k]))

В Python 2:

max(stats.iterkeys(), key=(lambda k: stats[k]))
person watsonic    schedule 05.05.2015
comment
Ваше решение для Python 3 также работает для Python 2.7. - person patapouf_ai; 28.05.2015
comment
потому что keys () не возвращает итератор в python 2 и, следовательно, снижает производительность - person watsonic; 04.06.2015

Я пришел сюда, чтобы узнать, как вернуть mydict.keys() на основе значения mydict.values(). Вместо того, чтобы возвращать только один ключ, я хотел вернуть максимальное количество значений x.

Это решение проще, чем использование функции max(), и вы можете легко изменить количество возвращаемых значений:

stats = {'a':1000, 'b':3000, 'c': 100}

x = sorted(stats, key=(lambda key:stats[key]), reverse=True)
['b', 'a', 'c']

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

x[0]
['b']

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

x[:2]
['b', 'a']
person ron_g    schedule 12.09.2018
comment
Это очень неэффективное решение. Сортировка dict потребует времени выполнения n log (n), потому что вы беспокоитесь о кучке значений, которые не являются максимальными. Использование функции max потребует времени выполнения всего n, что намного быстрее. - person Peter Graham; 23.08.2019
comment
@PeterGraham практически все решения здесь (включая принятый ответ) используют max(). Понятно, что он самый быстрый. Я подумал, что предложу другое решение с преимуществом нарезки, которое было для меня более полезным в то время. - person ron_g; 27.08.2019

С collections.Counter вы могли бы сделать

>>> import collections
>>> stats = {'a':1000, 'b':3000, 'c': 100}
>>> stats = collections.Counter(stats)
>>> stats.most_common(1)
[('b', 3000)]

При необходимости вы можете просто начать с пустого collections.Counter и добавить к нему

>>> stats = collections.Counter()
>>> stats['a'] += 1
:
etc. 
person ukrutt    schedule 23.02.2016

Намного более простой для понимания подход:

mydict = { 'a':302, 'e':53, 'g':302, 'h':100 }
max_value_keys = [key for key in mydict.keys() if mydict[key] == max(mydict.values())]
print(max_value_keys) # prints a list of keys with max value

Вывод: ['a', 'g']

Теперь вы можете выбрать только один ключ:

maximum = mydict[max_value_keys[0]]
person Ali Sajjad    schedule 02.06.2020

Очередь кучи - это обобщенное решение, которое позволяет извлекать верхние n ключей, упорядоченных по значению:

from heapq import nlargest

stats = {'a':1000, 'b':3000, 'c': 100}

res1 = nlargest(1, stats, key=stats.__getitem__)  # ['b']
res2 = nlargest(2, stats, key=stats.__getitem__)  # ['b', 'a']

res1_val = next(iter(res1))                       # 'b'

Примечание dict.__getitem__ - это метод, вызываемый синтаксическим сахаром dict[]. В отличие от dict.get, он вернет KeyError, если ключ не найден, чего здесь не может быть.

person jpp    schedule 01.11.2018

+1 к простейшему решению @Aric Coady.
А также один способ случайного выбора одного из ключей с максимальным значением в словаре:

stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000}

import random
maxV = max(stats.values())
# Choice is one of the keys with max value
choice = random.choice([key for key, value in stats.items() if value == maxV])
person Woooody Amadeus    schedule 20.05.2017

Как насчет:

 max(zip(stats.keys(), stats.values()), key=lambda t : t[1])[0]
person user2399453    schedule 04.09.2017
comment
zip(stats.keys(), stats.values()) - это просто более длинный способ записи stats.items(). После того, как вы внесете это изменение, ваш ответ будет почти идентичен нескольким более ранним ответам. - person vaultah; 04.09.2017
comment
Согласен, я не знал, что items () совпадает с zip - person user2399453; 05.09.2017
comment
items - это не то же самое, что zip. Это дает тот же результат. - person Paul Rooney; 25.10.2017

Для научных пользователей Python есть простое решение с использованием Pandas:

import pandas as pd
stats = {'a': 1000, 'b': 3000, 'c': 100}
series = pd.Series(stats)
series.idxmax()

>>> b
person wkzhu    schedule 14.02.2020

Я проверил принятый ответ И самое быстрое решение @ thewolf на очень простом цикле, и цикл был быстрее, чем оба:

import time
import operator


d = {"a"+str(i): i for i in range(1000000)}

def t1(dct):
    mx = float("-inf")
    key = None
    for k,v in dct.items():
        if v > mx:
            mx = v
            key = k
    return key

def t2(dct):
    v=list(dct.values())
    k=list(dct.keys())
    return k[v.index(max(v))]

def t3(dct):
    return max(dct.items(),key=operator.itemgetter(1))[0]

start = time.time()
for i in range(25):
    m = t1(d)
end = time.time()
print ("Iterating: "+str(end-start))

start = time.time()
for i in range(25):
    m = t2(d)
end = time.time()
print ("List creating: "+str(end-start))

start = time.time()
for i in range(25):
    m = t3(d)
end = time.time()
print ("Accepted answer: "+str(end-start))

полученные результаты:

Iterating: 3.8201940059661865
List creating: 6.928712844848633
Accepted answer: 5.464320182800293
person ragardner    schedule 11.07.2017

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

stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000, 'e':3000}

Вы можете получить коллекцию со всеми ключами с максимальным значением следующим образом:

from collections import defaultdict
from collections import OrderedDict

groupedByValue = defaultdict(list)
for key, value in sorted(stats.items()):
    groupedByValue[value].append(key)

# {1000: ['a'], 3000: ['b', 'd', 'e'], 100: ['c']}

groupedByValue[max(groupedByValue)]
# ['b', 'd', 'e']
person Ignacio Alorre    schedule 13.02.2020
comment
Хорошая точка зрения! Это решение намного проще: stackoverflow.com/a/47861776/10836415 - person Marjan Radfar; 17.02.2021

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

stats = {'a':1000, 'b':3000, 'c': 100}
max_key = None
if bool(stats):
   max_key = max(stats, key=stats.get)
print(max_key)

Это может сначала проверить, пустой словарь или нет, а затем обработать.

>>> b
person Shaonsani    schedule 02.04.2021

person    schedule
comment
если бы вы действительно хотели сделать это, вы могли бы сделать stats[max(stats, key=stats.get)] - person CrackSmoker9000; 26.02.2015
comment
@scottmrogowski, сс. Он предоставляет ключ с максимальным значением в соответствии с запросом. Максимальное значение будет просто max (stats.values ​​()). - person A. Coady; 17.03.2015
comment
Это должен быть ответ, поскольку это самый простой и именно то, что просил OP. - person ihatecache; 21.11.2015
comment
@Coady, что, если есть связь между двумя ключами (с одинаковым значением)? Я хочу получить их обоих, но получаю только один. - person oba2311; 03.04.2017
comment
@ oba2311 max_value = max(stats.values()); {key for key, value in stats.items() if value == max_value} - person A. Coady; 04.04.2017
comment
Почему не просто max(stats)? - person Elliott B; 20.06.2019
comment
@ElliottB: max(stats) возвращает максимальное количество ключей, а не ключ, значение которого равно максимальному. - person Andy L.; 20.06.2019
comment
это должен быть главный ответ - person yishairasowsky; 29.12.2019
comment
@ oba2311 - вы можете получить все ключи с максимальным значением, используя - max_val = [keys for keys,values in stats.items() if values == max(stats.values())] - person Sankar; 25.01.2020
comment
это жемчужина! - person Eran Moshe; 04.02.2020
comment
взорвался, у Python всегда есть хакерские решения - person QPeiran; 06.05.2020
comment
Это лучший ответ, поскольку он самый простой и не требует импорта другой библиотеки. Спасибо за решение! - person keirasan; 30.07.2020
comment
Это сломается, когда статистика будет пустым словарем. Для надежного решения мы можем использовать max(stats, key=stats.get) if stats else None - person Bhindi; 04.09.2020
comment
@ A.Coady Я понимаю, как это работает, но не понимаю, как stats.get не выдает ошибку. Когда я ищу функцию get, она говорит, что необходимо иметь значение ключа. Вы можете объяснить? - person user1050632; 28.04.2021

person    schedule
comment
спасибо прия хохер, мне помогло. - person Naresh Kumar; 19.07.2021

person    schedule
comment
Это упорядочит по ключу с повторяющимися максимальными значениями. Это может быть желательным, а может и нежелательным. - person Rob Rose; 30.03.2018