我有一个字典,其中键是字符串,值是整数。
stats = {'a': 1, 'b': 3000, 'c': 0}
如何获得具有最大值的键?在这种情况下,它是'b'。
有没有比使用带有反向键值元组的中间列表更好的方法?
inverse = [(value, key) for key, value in stats.items()]
print(max(inverse)[1])
我有一个字典,其中键是字符串,值是整数。
stats = {'a': 1, 'b': 3000, 'c': 0}
如何获得具有最大值的键?在这种情况下,它是'b'。
有没有比使用带有反向键值元组的中间列表更好的方法?
inverse = [(value, key) for key, value in stats.items()]
print(max(inverse)[1])
当前回答
我对这些答案都不满意。Max总是选择第一个具有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会选择哪个最大值?
其他回答
如果你只需要知道一个带有最大值的键,你可以不使用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变量,作为指向父作用域中定义的变量值的指针。
根据所选答案中的注释迭代解决方案…
在Python 3中:
max(stats.keys(), key=(lambda k: stats[k]))
在Python 2中:
max(stats.iterkeys(), key=(lambda k: stats[k]))
你可以使用运算符。Itemgetter:
import operator
stats = {'a': 1000, 'b': 3000, 'c': 100}
max(stats.iteritems(), key=operator.itemgetter(1))[0]
并且使用stats.iteritems()而不是在内存中构建一个新的列表。max()函数的key参数是一个函数,它计算一个用于确定如何对项目排序的键。
请注意,如果你有另一个键值对'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'
只是添加一个你想要选择某些键而不是所有键的情况:
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])```
在这种情况下,你有多个具有相同值的键,例如:
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']