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

Vij*_*jay 154 python lambda function

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

def winner():
    w = max(players, key=lambda p: p.totalScore)
Run Code Online (Sandbox Code Playgroud)

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

  1. max功能如何运作?它正在采取什么样的论据?我查看了文档,但没有理解.
  2. keymax函数中关键字的用途是什么?我知道它也用在sort功能的上下文中
  3. lambda表达式的含义?怎么看?他们是如何工作的?

这些都是非常无趣的概念性问题,但会帮助我理解语言.如果您可以举例解释,这将有所帮助.谢谢

Ash*_*ary 237

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

def func(p):
   return p.totalScore     
Run Code Online (Sandbox Code Playgroud)

现在max变成:

max(players, key=func)
Run Code Online (Sandbox Code Playgroud)

但由于def语句是复合语句,因此无法在需要表达式的地方使用它们,这就是为什么有时lambda使用它们的原因.

注意,这lambda相当于你在a的return语句中放入的内容def.因此,你不能在一个内部使用语句lambda,只允许表达式.


怎么max办?

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

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

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


key工作怎么样?

默认情况下,Python 2会key根据一基于对象类型的规则比较项目(例如,字符串总是大于整数).

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

例1:

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

>>> lis = ['1', '100', '111', '2']
Run Code Online (Sandbox Code Playgroud)

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

>>> max(lis)
'2'
Run Code Online (Sandbox Code Playgroud)

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

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

示例2:应用于max列表列表.

>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Run Code Online (Sandbox Code Playgroud)

默认情况下,max将按第一个索引比较项目.如果第一个索引相同,那么它将比较第二个索引.在我的示例中,所有项目都有唯一的第一个索引,因此您可以将其作为答案:

>>> max(lis)
(4, 'e')
Run Code Online (Sandbox Code Playgroud)

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

>>> max(lis, key = lambda x: x[1])
(-1, 'z')
Run Code Online (Sandbox Code Playgroud)

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

列出混合物品:

lis = ['1','100','111','2', 2, 2.57]
Run Code Online (Sandbox Code Playgroud)

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

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

但是在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()
Run Code Online (Sandbox Code Playgroud)

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

>>> max(lis, key=lambda x: int(x))  # or simply `max(lis, key=int)`
'111'
Run Code Online (Sandbox Code Playgroud)

  • @Mo2 迭代由 `max` 完成而不是 `lambda`(`key` arg 是可选的),并且在迭代过程中,每个项目都被传递给 `key` 中指定的函数,然后将返回值用于比较。 (2认同)
  • 只是为了通过谷歌搜索"最大关键参数"来到这里的人.`max(lis,key = lambda x:int(x))`可以简化为`max(lis,key = int)`.Python有一个内置函数int().类似地,您可以使用任何其他内置函数作为`key`参数.例如,你可以通过`max(lis,key = len)从`lis = ['a','aa','aaa']`得到最长的字符串. (2认同)
  • @YOUNG我们可以使用任何函数作为关键参数,而不仅仅是内置函数,唯一的条件是该函数应该正确接受由`max`、`min`、`sorted`等传递给它的项目。另外我在最后提到了`max(lis, key=int)`。:-) (2认同)

Mar*_*zer 10

非常简化的版本max:

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

关于lambda:

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

>>> times_two = lambda x: 2*x
>>> times_two(2)
4
Run Code Online (Sandbox Code Playgroud)


cha*_*oin 9

max功能如何工作?

它在迭代中查找"最大"项.我假设您可以查找它是什么,但如果没有,它可以循环,即列表或字符串.

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

Key是一个lambda函数,它将告诉max迭代中哪些对象比其他对象大.假如你要对自己创建的对象进行排序,而不是像整数那样明显的对象.

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

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

def sum(a, b, f):
    return (f(a) + f(b))
Run Code Online (Sandbox Code Playgroud)

这需要两个对象,a并且b和功能f.它调用f()每个对象,然后将它们一起添加.所以看看这个电话:

>>> sum(2, 2, lambda a:  a * 2)
8
Run Code Online (Sandbox Code Playgroud)

sum()take 2,并在其上调用lambda表达式.所以f(a)变得2 * 2,成为4.然后做这行b,并将两者结合起来.

简单来说,lambda来自lambda演算,这是一个返回函数的函数的概念; 用于表达计算的非常酷的数学概念.你可以在这里阅读,然后在这里实际理解它.

最好再读一下这个,因为lambda可能会让人感到困惑,而且它们的实用性并不是很明显.请点击这里.


sha*_*k3r 6

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.
Run Code Online (Sandbox Code Playgroud)

因此,key=func基本上允许我们将一个可选参数传递key给函数,在该函数的基础上对给定的迭代器/参数进行排序并返回最大值.

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

如果未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')
Run Code Online (Sandbox Code Playgroud)


Inb*_*ose 5

根据文件:

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

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

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

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

可以想象,对于像player确定其比较值的复杂对象一样棘手,所以给出了key参数来确定max函数如何决定每个值的值player.在这种情况下,您使用的是lambda函数说"每个pplayers获取p.totalscore和使用,作为他的价值进行比较."


Gah*_*han 5

max内置函数,它接受第一个参数 an iterable(如列表或元组)

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

考虑这个示例字典:

d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}
Run Code Online (Sandbox Code Playgroud)

前任:

>>> max(d.keys())
'sword'
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,如果你只传递没有 kwarg(a function to key)的 iterable,它会返回 key 的最大值(按字母顺序)

前任。您可能需要按键的长度查找最大键,而不是按字母顺序查找键的最大值:

>>>max(d.keys(), key=lambda x: len(x))
'artwork'
Run Code Online (Sandbox Code Playgroud)

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

前任。

>>> max(d.keys(), key=lambda x: d[x])
'friend'
Run Code Online (Sandbox Code Playgroud)

在此示例中,lambda 函数返回具有最大值的相应字典键的值