我有一个字典,其中键是字符串,值是整数。

stats = {'a': 1, 'b': 3000, 'c': 0}

如何获得具有最大值的键?在这种情况下,它是'b'。


有没有比使用带有反向键值元组的中间列表更好的方法?

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

当前回答

+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])

其他回答

max(stats, key=stats.get)

要获得字典统计的最大键/值:

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”

解释

Python 3中的字典方法items()返回字典的视图对象。当这个视图对象被max函数遍历时,它会以(key, value)形式的元组生成字典项。

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

当您使用lambda表达式lambda x: x[1]时,在每次迭代中,x是这些元组(键,值)之一。因此,通过选择正确的索引,您可以选择是通过键还是通过值进行比较。

Python 2

对于Python 2.2+版本,同样的代码也可以工作。但是,为了提高性能,最好使用iteritems()字典方法而不是items()。

笔记

这个答案是基于Climbs_lika_Spyder的回答上的评论。 使用的代码在Python 3.5.2和Python 2.7.10上进行了测试。

在这种情况下,你有多个具有相同值的键,例如:

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']

这是另一个:

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

函数键只是返回应该用于排序的值,max()立即返回所需的元素。

我测试了接受的答案和@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