Получение ключа с максимальным значением в словаре? - PullRequest
706 голосов
/ 06 ноября 2008

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

Пример:

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

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

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

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

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

Ответы [ 20 ]

9 голосов
/ 05 мая 2015

За повторные решения через комментарии в выбранном ответе ...

В Python 3:

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

В Python 2:

max(stats.iterkeys(), key=(lambda k: stats[k]))
6 голосов
/ 23 февраля 2016

С 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. 
6 голосов
/ 12 сентября 2018

Я тут искал, как вернуть 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']
4 голосов
/ 06 ноября 2008

Спасибо, очень элегантно, я не помню, чтобы max допускал параметр "ключ".

Кстати, чтобы получить правильный ответ ('b'), оно должно быть:

import operator
stats = {'a':1000, 'b':3000, 'c': 100}
max(stats.iteritems(), key=operator.itemgetter(1))[0]
3 голосов
/ 10 января 2018

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

1 голос
/ 01 ноября 2018

Очередь кучи - это обобщенное решение, которое позволяет извлекать верхние 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, если ключ не найден, чего здесь не может быть.

1 голос
/ 20 июня 2013
Counter = 0
for word in stats.keys():
    if stats[word]> counter:
        Counter = stats [word]
print Counter
1 голос
/ 20 мая 2017
Самое простое решение от

+ 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])
0 голосов
/ 04 сентября 2017

Как насчет:

 max(zip(stats.keys(), stats.values()), key=lambda t : t[1])[0]
0 голосов
/ 11 июля 2017

Я проверил принятый ответ И самое быстрое решение @ 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
...