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

2024-04-24 23:05:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自OOP背景,想学习python。 我正在使用max函数,该函数使用lambda表达式返回在列表players中具有最大值totalScore的类型Player的实例。

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

函数正确返回类型为Player且最大值为totalScore的实例。 我对以下三件事感到困惑:

  1. max函数如何工作?它的论点是什么?我看了文件,但没能理解。
  2. max函数中关键字key的用途是什么?我知道它也用于sort函数的上下文中
  3. lambda表达式的含义?怎么读呢?它们是如何工作的?

这些都是些很低级的概念性问题,但能帮助我理解语言。如果你能举例说明的话,那会有帮助的。 谢谢


Tags: 实例lambdakey函数类型列表表达式def
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

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

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


如何工作?

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

要在比较之前修改对象,或者基于特定的属性/索引进行比较,必须使用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')

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

包含混合项的列表:

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'

How does the max function work?

它在iterable中查找“最大”的项。我想你 可以查一下那是什么,但如果不是,你可以查一下, i、 列表或字符串。

What is use of the keyword key in max function? I know it is also used in context of sort function

Key是一个lambda函数,它将告诉maxiterable中哪些对象比其他对象大。假设您正在对自己创建的某个对象进行排序,而不是像整数这样明显的对象。

Meaning of the lambda expression? How to read them? How do they work?

这是一个更大的问题。简单地说,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执行此操作,并将两者相加。

简单地说,lambda来自lambda演算,这是一个返回函数的函数的概念;一个非常酷的数学概念,用于表示计算。你可以阅读here,然后真正理解它here

最好再多读一点,因为lambdas可能会让人困惑,而且它们有多有用还不是很明显。检查here

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

相关问题 更多 >