使用'key'和lambda表达式的python max函数

发布于 2021-02-02 23:12:50

我来自OOP背景,尝试学习python。我使用的max函数使用lambda表达式返回列表中Player具有最大类型的实例。totalScoreplayers

def winner():
    w = max(players, key=lambda p: p.totalScore)

该函数正确返回Player具有maximum类型的实例totalScore。我对以下三件事感到困惑:

  1. 该max功能如何工作?它正在采取什么论点?我查看了文档,但听不懂。
  2. keymax函数中关键字的用途是什么?我知道它也用于sort功能上下文
  3. lambda表达式的含义?如何阅读它们?它们如何工作?
    这些都是非常笨拙的概念性问题,但可以帮助我理解语言。如果你可以提供示例进行解释,这将有所帮助。
关注者
0
被浏览
82
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    lambda是一个匿名函数,它等效于:

    def func(p):
       return p.totalScore    
    

    现在max变成:

    max(players, key=func)
    

    但是由于def语句是复合语句,因此不能在需要表达式的地方使用它们,这就是有时lambda使用的原因。

    请注意,这lambda等效于你在的return语句中输入的内容def。因此,你不能在内使用语句lambda,仅允许使用表达式。

    怎么max办?

    max(a,b,c,... [,key = func])->

    使用单个可迭代的参数,返回其最大的项目。具有两个或更多参数,返回最大参数。

    因此,它仅返回最大的对象。

    key工作如何?

    在Python 2中,默认情况下key根据对象类型(例如,字符串始终大于整数)基于一组规则比较项目。

    要在比较之前修改对象,或基于特定的属性/索引进行比较,必须使用key参数。

    范例1:

    一个简单的示例,假设你有一个字符串形式的数字列表,但是你想按其整数值比较这些项目。

    >>> lis = ['1', '100', '111', '2']
    

    这里max使用它们的原始值比较项目(按字典顺序比较字符串,这样你就可以得到‘2’输出):

    >>> max(lis)
    '2'
    

    要通过整数比较项目,请使用key简单的lambda:

    >>> max(lis, key=lambda x:int(x))  # compare `int` version of each item
    '111'
    

    示例2:应用于max元组列表。

    >>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
    

    默认情况下,max将按第一个索引比较项目。如果第一个索引相同,则将比较第二个索引。在我的示例中,所有项目都有唯一的第一个索引,因此你将获得以下答案:

    >>> max(lis)
    (4, 'e')
    

    但是,如果你想通过索引1的值比较每个项目,该怎么办?简单:使用lambda:

    >>> max(lis, key = lambda x: x[1])
    (-1, 'z')
    

    比较包含不同类型对象的可迭代项:

    混合项目清单:

    lis = ['1','100','111','2', 2, 2.57]
    

    在Python 2中,可以比较两种不同类型的项目:

    >>> max(lis)  # works in Python 2
    '2'
    >>> max(lis, key=lambda x: int(x))  # compare integer version of each item
    '111'
    

    但是在Python 3中,你不能再这样做了:

    >>> lis = ['1', '100', '111', '2', 2, 2.57]
    >>> max(lis)
    Traceback (most recent call last):
      File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
        max(lis)
    TypeError: unorderable types: int() > str()
    

    但这可行,因为我们正在比较每个对象的整数版本:

    >>> max(lis, key=lambda x: int(x))  # or simply `max(lis, key=int)`
    '111'
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看