我有一个字典,其中键是字符串,值是整数。
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])
当前回答
我测试了接受的答案和@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
其他回答
下面是两种简单的方法从给定的字典中提取键的最大值
import time
stats = {
"a" : 1000,
"b" : 3000,
"c" : 90,
"d" : 74,
"e" : 72,
}
start_time = time.time_ns()
max_key = max(stats, key = stats.get)
print("Max Key [", max_key, "]Time taken (ns)", time.time_ns() - start_time)
start_time = time.time_ns()
max_key = max(stats, key=lambda key: stats[key])
print("Max Key with Lambda[", max_key, "]Time taken (ns)", time.time_ns() - start_time)
输出
Max Key [ b ] Time taken (ns) 3100
Max Key with Lambda [ b ] Time taken (ns) 1782
使用Lambda表达式的解决方案似乎对较小的输入执行得更好。
试试这个:
sorted(dict_name, key=dict_name.__getitem__, reverse=True)[0]
根据所选答案中的注释迭代解决方案…
在Python 3中:
max(stats.keys(), key=(lambda k: stats[k]))
在Python 2中:
max(stats.iterkeys(), key=(lambda k: stats[k]))
max(stats, key=stats.get)
如果你只需要知道一个带有最大值的键,你可以不使用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变量,作为指向父作用域中定义的变量值的指针。