我有一个字典,其中键是字符串,值是整数。
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])
当前回答
只是添加一个你想要选择某些键而不是所有键的情况:
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}
如果你想用它的键找到Max值,也许下面的步骤很简单,不需要任何相关的函数。
max(stats, key=stats.get)
输出是具有Max值的键。
要获得字典统计的最大键/值:
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上进行了测试。
根据所选答案中的注释迭代解决方案…
在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'
我测试了接受的答案和@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