我创建了一个字典:
scores = {5: 35044.51299744237, 25: 29016.41319191076, 50: 27405.930473214907, 100: 27282.50803885739, 250: 27893.822225701646, 500: 29454.18598068598}
我可以使用以下方法将最小函数与它一起使用:
min(scores.keys(),key = lambda x: scores[x])
min(scores, key=scores.get)
但是当我尝试使用时:
min(scores.keys(),key = scores.values())
我收到一个错误:
"dict_values"对象不可调用
有人可以解释一下为什么吗?
key
必须是可以使用一个参数调用的函数。values()
不是一个函数,它是一个视图,字典中所有值的序列。虽然scores.values
是一个函数,但它不能用参数调用。
目前还不清楚您认为您的代码段即使有效也会实际做什么。在值集中查找键究竟会做什么?
你会得到'dict_values' object is not callable
,因为min
中的key
参数需要一个可调用的对象(具有__call__
方法的对象(。在您的情况下,scores.values()
返回类型为<class 'dict_values'>
且不可调用的对象。
>>> dct = {}
>>> type(dct.values())
<class 'dict_values'>
>>> callable(dct.values())
False
如果您希望获得具有最小值的密钥,则应尝试类似操作。
min(scores.items(), key=lambda x: x[1])[0]
或与operator.itemgetter
:
from operator import itemgetter
min(scores.items(), key=itemgetter(1))[0]
换句话说,min
key
函数应用于scores.items()
提供的元素。
如果你尝试scores.keys()
,就像你的问题一样,min
函数对其值一无所知。虽然你仍然可以这样做:
min(scores.keys(), key=lambda key: scores[key])
但我不推荐这个解决方案,因为key
函数包含scores
在某些情况下可能导致未定义的行为。