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

时间:2013-08-18 07:33:12

标签: python function aws-lambda

我来自OOP背景并试图学习python。 我正在使用max函数,该函数使用lambda表达式返回列表Player中具有最大totalScore的{​​{1}}类型的实例。

players

该函数正确返回具有最大def winner(): w = max(players, key=lambda p: p.totalScore) 的{​​{1}}类型的实例。 我对以下三件事感到困惑:

  1. Player功能如何运作?它正在采取什么样的论据?我查看了文档,但没有理解。
  2. max函数中关键字totalScore的用途是什么?我知道它也用在max函数
  3. 的上下文中
  4. lambda表达式的含义?怎么看?它们是如何工作的?
  5. 这些都是非常无聊的概念性问题,但会帮助我理解语言。如果您可以举例解释,这将有所帮助。 感谢

6 个答案:

答案 0 :(得分:222)

lambda是一个匿名函数,它相当于:

def func(p):
   return p.totalScore     

现在max变为:

max(players, key=func)

但由于def语句是复合语句,因此无法在需要表达式的情况下使用它们,这就是有时使用lambda的原因。

请注意,lambda等同于您在def的return语句中放置的内容。因此,您不能在lambda内使用语句,只允许使用表达式。


max做什么?

  

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

     

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

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


key如何运作?

默认情况下,Python 2 key根据对象的类型比较基于set of rules的项目(例如,字符串总是大于整数)。

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

示例1:

一个简单的例子,假设你有一个字符串形式的数字列表,但是你想用它们的整数值来比较这些项目。

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

此处max使用原始值对项目进行比较(字符串按字典顺序进行比较,因此您将获得'2'作为输出):

>>> max(lis)
'2'

要比较项目的整数值,请使用keylambda进行比较:

>>> 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]

In Python 2 it is possible to compare items of two different types

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

But in Python 3 you can't do that any more

>>> 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'

答案 1 :(得分:9)

max的简化版本:

def max(items, key=lambda x: x):
    current = item[0]
    for item in items:
        if key(item) > key(current):
            current = item
    return current

关于lambda:

>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5

>>> times_two = lambda x: 2*x
>>> times_two(2)
4

答案 2 :(得分:9)

  

最大功能如何运作?

它在迭代中查找“最大”项。我会假设你 可以查看那是什么,但如果不是,那就是你可以循环的东西, 即列表或字符串。

  

max函数中关键字key的用途是什么?我知道它也用在sort函数的上下文中

Key是一个lambda函数,它将告诉max迭代中哪些对象比其他对象大。如果你正在排序你自己创建的一些对象,而不是像整数那样明显的东西。

  

lambda表达式的含义?怎么看?他们是如何运作的?

这是一个更大的问题。简单来说,lambda是一个你可以传递的函数,并且有其他代码使用它。以此为例:

def sum(a, b, f):
    return (f(a) + f(b))

这需要两个对象ab以及一个函数f。 它在每个对象上调用f(),然后将它们一起添加。所以看看这个电话:

>>> sum(2, 2, lambda a:  a * 2)
8

sum()接受2,并在其上调用lambda表达式。因此f(a)变为2 * 2,变为4.然后为b执行此操作,并将两者加在一起。

用不那么简单的术语来说,lambdas来自lambda演算,这是一个返回函数的函数的概念;用于表达计算的非常酷的数学概念。您可以阅读here,然后了解 here

最好再多阅读一下这一点,因为lambdas可能会让人感到困惑,而且它们的有用程度并不是很明显。检查here

答案 3 :(得分:5)

根据documentation

  

max(iterable [,key])
max(arg1,arg2,* args [,key])
返回   可迭代中的最大项或两个或多个参数中的最大项。

     

如果提供了一个位置参数,则iterable必须是非空的   iterable(例如非空字符串,元组或列表)。最大的项目   在iterable中返回。如果有两个或多个位置参数   如果提供,则返回最大的位置参数。

     

可选键参数指定单参数排序函数   就像用于list.sort()的那样。必须提供关键参数(如果提供)   以关键字形式(例如,max(a,b,c,key = func))。

这就是说,在您的情况下,您提供的是一个列表,在本例中为players。然后max函数将迭代列表中的所有项目并将它们相互比较以获得“最大值”。

可以想象,像player这样的复杂对象确定其比较值很棘手,因此您将获得key参数来确定max函数将如何决定每个player的值。在这种情况下,您使用lambda函数说出“p获取players中的每个p.totalscore并将其用作比较值”。

答案 4 :(得分:5)

max函数用于获取iterable的最大值。

迭代器可以是列表,元组,字典对象等。甚至可以是您提供的示例中的自定义对象。

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

With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

因此,key=func基本上允许我们将可选参数key传递给函数,在该函数的基础上,给定的迭代器/参数被排序&amp;返回最大值。

lambda是一个python关键字,充当伪函数。因此,当您将player对象传递给它时,它将返回player.totalScore。因此,传递给函数max的迭代将根据给予它的key个对象的player totalScore 进行排序。将返回最大player的{​​{1}}。

如果未提供totalScore参数,则根据默认的Python排序返回最大值。

示例 -

key

答案 5 :(得分:1)

max内置函数,第一个参数为iterable(如列表或元组)

关键字参数key具有默认值None,但它接受要评估的函数,将其视为基于函数计算可迭代的包装器

考虑这个示例字典:

d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}

例如:

>>> max(d.keys())
'sword'

正如您所看到的,如果您只传递没有kwarg的迭代(函数为key),它将返回key的最大值(按字母顺序)

实施例。 您可能需要按密钥的长度找到最大密钥,而不是按字母顺序查找密钥的最大值:

>>>max(d.keys(), key=lambda x: len(x))
'artwork'

在这个示例中,lambda函数返回将被迭代的键的长度,因此在评估值而不是按字母顺序考虑时,它将跟踪键的最大长度并返回具有最大长度的键

实施例

>>> max(d.keys(), key=lambda x: d[x])
'friend'

在此示例中,lambda函数返回具有最大值

的相应字典键的值