【问题标题】:Can't use dict.values() with min func's key不能将 dict.values() 与 min func 的键一起使用
【发布时间】:2020-05-29 22:55:26
【问题描述】:

我创建了一个字典:

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' 对象不可调用

谁能解释一下原因?

【问题讨论】:

  • 为什么它应该起作用?
  • key 是您应用到迭代器的每个元素以确定要比较的实际值的函数。当你传递 key=scores.values() 时,你会得到 DictValues 对象(类似于列表),它不是一个函数
  • key 应该是一个函数,可迭代的每个项目都传递给该函数。并且该函数应该返回一个值,通过该值可以找到min
  • 因为你是直接调用scores.values(),它返回一个dict_values对象作为min的key函数。 Min 尝试将此 dict_values 称为函数。由于它没有函数(不可调用),因此引发了上述错误。

标签: python dictionary min


【解决方案1】:

key 必须是一个可通过一个参数调用的函数。 values() 不是一个函数,它是一个视图,是字典中所有值的序列。虽然scores.values 是一个函数,但它不能通过参数调用。

也不清楚你认为你的 sn-p 会做什么,即使它有效。在一组值中寻找一个键究竟会做什么?

【讨论】:

    【解决方案2】:

    您会得到'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]
    

    换句话说,minkey 函数应用于scores.items() 提供的元素。

    如果您尝试scores.keys(),就像您的问题一样,min 函数对其值一无所知。虽然你仍然可以这样做:

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

    但我不推荐这种解决方案,因为key 函数内部包含scores,在某些情况下会导致未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      相关资源
      最近更新 更多