Не могу использовать dict.values ​​() с ключом min fun c - PullRequest
0 голосов
/ 14 февраля 2020

Я создал dict:

scores = {5: 35044.51299744237, 25: 29016.41319191076, 50: 27405.930473214907, 100: 27282.50803885739, 250: 27893.822225701646, 500: 29454.18598068598} 

Я могу использовать с ним функцию min, используя:

min(scores.keys(),key = lambda x: scores[x])
min(scores, key=scores.get)

, но когда я пытаюсь использовать:

min(scores.keys(),key = scores.values())

Я получаю сообщение об ошибке:

Объект 'dict_values' не может быть вызван

Может кто-нибудь объяснить, почему?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вы получаете 'dict_values' object is not callable, поскольку для аргумента key в min требуется вызываемый объект (объект, имеющий метод __call__). В вашем случае scores.values() возвращает объект с типом <class 'dict_values'>, который не может быть вызван.

>>> dct = {}
>>> type(dct.values())
<class 'dict_values'>
>>> callable(dct.values())
False

Если вы хотите sh, чтобы получить ключ с минимальным значением, вы должны попробовать что-то вроде этого.

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 внутри, что в некоторых случаях может привести к неопределенному поведению.

0 голосов
/ 14 февраля 2020

key должна вызываться функцией с одним параметром. values() это не функция, это представление, последовательность всех значений в dict. И хотя scores.values - это функция, которую нельзя вызвать с параметром.

Также неясно, что, по вашему мнению, на самом деле будет делать ваш фрагмент, даже если он сработает. Что именно ищет ключ в наборе значений?

...