python max函数使用'key'和lambdaexpression式

我来自面向对象的背景,并试图学习python。 我正在使用max函数,它使用lambdaexpression式来返回列表players Player具有最大totalScore Playertypes的实例。

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

该函数正确地返回具有最大totalScore Playertypes的实例。 我对以下三件事感到困惑:

  1. max函数是如何工作的? 它正在采取什么论据? 我看了看文档,但是不明白。
  2. max函数中关键字key用法是什么? 我知道它也用于sortfunction的上下文中
  3. lambdaexpression式的含义? 如何阅读? 他们如何工作?

这些都是非常不好的概念性问题,但会帮助我理解语言。 如果你能举个例子来解释,这将有所帮助。 谢谢

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

 def func(p): return p.totalScore 

现在max变成:

 max(players, key=func) 

但是由于def语句是复合语句,所以在需要expression式的地方不能使用它们,这就是为什么有时使用lambdaexpression式的原因。

请注意,lambda相当于您在def的return语句中放入的内容。 因此,你不能在lambda内使用语句,只允许expression式。


max做什么?

最大(a,b,c,… [,key = func]) – >值

用一个可迭代的参数,返回其最大的项目。 用两个或多个参数,返回最大的参数。

所以,它只是返回最大的对象。


 How `key` works? 

默认情况下,在Python 2中,key根据一组基于对象types的规则 (例如,一个string总是大于一个整数)来比较项目。

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

例1:

一个简单的例子,假设你有一个stringforms的数字列表,但你想比较这些项目的整数值。

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

在这里, max用项目的原始值进行比较(string按照字典顺序进行比较,所以你可以得到'2'作为输出):

 >>> max(lis) '2' 

比较项目的整数值使用键与一个简单的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') 

比较包含不同types对象的迭代中的项目

列出混合项目:

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

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

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

max函数是如何工作的?

它在迭代中寻找“最大”的项目。 我假设你可以查看它是什么,但是如果没有,你可以循环,即列表或string。

max函数中关键字key的用法是什么? 我知道它也用于sortingfunction的上下文中

Key是一个lambda函数,它将告诉max iterable中哪些对象比其他对象大。 说如果你正在sorting你自己创build的某个对象,而不是明显的东西,比如整数。

lambdaexpression式的含义? 如何阅读? 他们如何工作?

这是一个更大的问题。 简而言之,lambda是一个可以传递的函数,并有其他代码片段使用它。 以此为例:

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

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

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

sum()2 ,并调用它的lambdaexpression式。 所以f(a)变成2 * 2 ,变成4.然后它为b做了这个,并且把它们加在一起。

不是那么简单的术语,lambda来自lambda微积分,这是返回函数的函数的思想; 一个expression计算的非常酷的math概念。 你可以在这里阅读,然后在这里真正理解它。

这可能是更好的阅读这个多一点,因为lambda可能会混淆,并不是一目了然,他们是多么有用。 在这里检查。

最大限度的简化版本:

 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 

根据文件 :

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

如果提供了一个位置参数,则iterable必须是非空的可迭代的(例如非空string,元组或列表)。 迭代中最大的项目被返回。 如果提供了两个或多个位置参数,则返回最大的位置参数。

可选的key参数指定一个像list.sort()那样的单参数sorting函数。 关键参数(如果提供)必须以关键字forms(例如,max(a,b,c,key = func))。

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

正如你所想象的那样,像player这样的复杂对象决定其比较价值是非常棘手的,所以你给了key参数来决定max函数如何决定每个player的价值。 在这种情况下,你正在使用一个lambda函数来表示“对于players每个p得到p.totalscore并将其用作比较值”。

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到函数的基础上,给定的迭代器/参数被sorting并返回最大值。

lambda是一个python关键字,充当伪函数。 所以,当你传递player对象时,它会返回player.totalScore 。 因此,传递给函数max的迭代器将根据赋予给它的player对象的key totalScore进行sorting并返回具有最大totalScoreplayer

如果没有提供key参数,则根据默认的Pythonsorting返回最大值。

例子 –

 max(1, 3, 5, 7) >>>7 max([1, 3, 5, 7]) >>>7 people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')] max(people, key=lambda x: x[1]) >>>('Oprah', 'Winfrey')