【问题标题】:How do keys work in min and max?键在最小值和最大值中如何工作?
【发布时间】:2014-02-04 04:36:05
【问题描述】:

我运行了以下语句序列:

>>> a = range(10)
>>> min(a, key=lambda x: x < 5.3)
6
>>> max(a, key=lambda x: x < 5.3)
0

最小值和最大值与我的预期完全相反。

关于 min 和 max 的 python 文档非常粗略。

谁能向我解释一下“钥匙”是如何工作的?

【问题讨论】:

    标签: python key max min


    【解决方案1】:

    key 参数说明

    关键是这样的:

    a_list = ['apple', 'banana', 'canary', 'doll', 'elephant']
    
    min(a_list, key=len)
    

    返回'doll',然后

    max(a_list, key=len)
    

    返回'elephant'

    您向它提供一个函数,它使用应用于每个项目的函数结果的最小值或最大值来确定要在结果中返回哪个项目。

    应用

    如果你的函数返回一个布尔值,就像你的一样,对于 min,它将返回 True 或 False 的最小值(即 False)中的第一个,即 6 或最大值(True)中的第一个,即0.

    看到这个:

    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> import pprint
    >>> pprint.pprint(dict((i, i<5.3) for i in a))
    {0: True,
     1: True,
     2: True,
     3: True,
     4: True,
     5: True,
     6: False,
     7: False,
     8: False,
     9: False}
    

    为什么?

    >>> min([True, False])
    False
    >>> max([True, False])
    True
    

    说明

    为什么True 大于False

    >>> True == 1
    True
    >>> False == 0
    True
    >>> issubclass(bool, int)
    True
    

    事实证明TrueFalse10 密切相关。他们甚至分别评估相同。

    【讨论】:

    • JB 和 Aaron:希望我能接受你的两个答案。将它给亚伦,因为他打字更多。 :) 谢谢!现在我懂了。我将“键”解释为“过滤器”,而它们是元素应该被比较的方式。
    【解决方案2】:

    因为所有值都是TrueFalse。所以选择了第一个。

    min([True, 1, False, 0])
    

    将返回 False 而不是 0,因为两者具有相同的值,但 False 首先发生

    您的代码使用只有布尔值的key 函数,因此对于min,第一个False 发生在号码6。所以它是被选中的。

    你可能想做的是:

    min(x for x in range(10) if x < 5.3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-08
      • 2023-04-02
      • 2020-06-29
      • 2021-11-08
      • 2014-11-03
      • 2021-04-09
      • 1970-01-01
      相关资源
      最近更新 更多