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

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

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


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

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

当前回答

堆队列是一个通用的解决方案,它允许你提取按值排序的前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相反。如果没有找到键,它将返回KeyError,这在这里是不可能发生的。

其他回答

Counter = 0
for word in stats.keys():
    if stats[word]> counter:
        Counter = stats [word]
print Counter

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

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()立即返回所需的元素。

只是添加一个你想要选择某些键而不是所有键的情况:

stats = {'a':1000, 'b':3000, 'c': 100, 'd':3000, 'e':3000}
keys_to_search = ["a", "b", "c"]

max([k for k in keys_to_search], key=lambda x: stats[x])```

如果你只需要知道一个带有最大值的键,你可以不使用iterkeys或iteritems,因为在Python中迭代字典就是迭代它的键。

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

编辑:

来自评论,@user1274878:

我不熟悉python。你能分步骤解释一下你的答案吗?

是的……

max

马克斯(iterable(关键)) Max (arg1, arg2, *args[, key]) 返回可迭代对象中最大的项或两个或多个参数中最大的项。

可选参数key描述了如何比较元素以获得它们之间的最大值:

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

返回值将进行比较。

Dict

Python dict是一个哈希表。dict的键是声明为键的对象的哈希值。由于性能原因,迭代通过字典实现迭代通过它的键。

因此,我们可以用它来消除获取键列表的操作。

关闭

定义在另一个函数内部的函数称为嵌套函数。嵌套函数可以访问封闭范围的变量。

通过lambda函数的__closure__属性可用的stats变量,作为指向父作用域中定义的变量值的指针。