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

81 5

我有OOP背景,在尝试学习python ,我使用max函数,使用lambda表达式返回Player实例的列表players中最大totalScore。


def winner():


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



函数返回Player类型的实例,该实例有最大的totalScore ,我对以下三件事感到困惑:

  • max函数的工作原理? 它的参数是什么? 我查看了文档,但无法理解,
  • max函数中关键字key的用法? 我知道它在sort函数的上下文中使用
  • lambda表达式的含义? 它们如何工作?

如果你能举例说明,那会有所帮助。谢谢

时间: 原作者:

135 3

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


def func(p):


 return p.totalScore 



现在max变成了:


max(players, key=func)



但是由于def语句是复合语句,它们不能在需要表达式的位置使用,这就是为什么lambda被使用。

注意lambda与你在def的返回语句中所放的内容相当,因此,不能在lambda中使用语句,只允许使用表达式。

max的工作原理?

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

使用一个iterable参数,返回它最大项,使用两个或多个参数,返回最大的参数。

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

key如何工作?

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

示例1:

一个简单的例子,假设你有一个字符串形式的数字列表,但是,你希望比较它们。


>>> lis = ['1', '100', '111', '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')



比较包含不同类型对象的iterable中的项:

包含混合项目的列表:


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'



原作者:
122 0

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



原作者:
112 4

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

迭代器可以是列表,元组,dict对象等,


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基本上允许我们将一个可选的参数键传递给函数,在该函数的基础上,给定的迭代器/参数被排序,返回最大值。

lambda是一个python关键字,充当伪函数,因此,当你将player对象传递给它时,它将返回player.totalScore ,因此,传递给函数max的iterable将根据player对象的key totalScore进行排序,将返回最大totalScoreplayer

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

例子-


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



原作者:
...