python max function using 'key' and lambda expression
我来自OOP背景,尝试学习Python。我使用的是
1 2 | def winner(): w = max(players, key=lambda p: p.totalScore) |
函数正确返回具有最大
这些都是非常不寻常的概念性问题,但会帮助我理解语言。如果你能举出一些例子来解释,那会有帮助的。谢谢
1 2 | def func(p): return p.totalScore |
现在,
1 | max(players, key=func) |
但是,由于
注意,
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.
所以,它只返回最大的对象。
默认情况下,在python2中,
要在比较之前修改对象,或者根据特定的属性/索引进行比较,必须使用
例1:
一个简单的例子,假设您有一个字符串形式的数字列表,但是您希望通过它们的整数值来比较这些项目。
1 | >>> lis = ['1', '100', '111', '2'] |
这里,
1 2 | >>> max(lis) '2' |
使用
1 2 | >>> max(lis, key=lambda x:int(x)) # compare `int` version of each item '111' |
例2:将
1 | >>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')] |
默认情况下,
1 2 | >>> max(lis) (4, 'e') |
但是,如果你想用索引1的值来比较每一项呢?简单:使用
1 2 | >>> max(lis, key = lambda x: x[1]) (-1, 'z') |
比较包含不同类型对象的iterable中的项:
混合项目列表:
1 | lis = ['1','100','111','2', 2, 2.57] |
在Python2中,可以比较两种不同类型的项:
1 2 3 4 | >>> max(lis) # works in Python 2 '2' >>> max(lis, key=lambda x: int(x)) # compare integer version of each item '111' |
但在Python3中,您不能再这样做了:
1 2 3 4 5 6 | >>> 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() |
但这是可行的,因为我们正在比较每个对象的整数版本:
1 2 | >>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)` '111' |
How does the max function work?
它在iterable中查找"最大"项。我假设你可以查到那是什么,但如果不是,那是你可以循环的东西,即列表或字符串。
What is use of the keyword key in max function? I know it is also used in context of sort function
Meaning of the lambda expression? How to read them? How do they work?
这是一个更大的问题。简单来说,lambda是一个可以传递的函数,其他代码也可以使用它。例如:
1 2 | def sum(a, b, f): return (f(a) + f(b)) |
这需要两个对象:
1 2 | >>> sum(2, 2, lambda a: a * 2) 8 |
用不那么简单的术语来说,lambda来自lambda演算,它是一个返回函数的函数的概念;一个表示计算的非常酷的数学概念。你可以在这里读到,然后真正理解它。
更多地阅读这篇文章可能会更好,因为lambda可能会让人困惑,而且它们的用处并不是很明显。请在这里查一下。
1 2 3 4 5 6 | def max(items, key=lambda x: x): current = item[0] for item in items: if key(item) > key(current): current = item return current |
关于lambda:
1 2 3 4 5 6 7 8 9 | >>> ident = lambda x: x >>> ident(3) 3 >>> ident(5) 5 >>> times_two = lambda x: 2*x >>> times_two(2) 4 |
迭代器可以是列表、元组、dict对象等,甚至是您提供的示例中的自定义对象。
1 2 3 4 5 | 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. |
因此,
如果没有提供
实例-
1 2 3 4 5 6 7 8 | 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') |
根据文件:
max(iterable[, key]) max(arg1, arg2, *args[, key]) Return the
largest item in an iterable or the largest of two or more arguments.If one positional argument is provided, iterable must be a non-empty
iterable (such as a non-empty string, tuple or list). The largest item
in the iterable is returned. If two or more positional arguments are
provided, the largest of the positional arguments is returned.The optional key argument specifies a one-argument ordering function
like that used for list.sort(). The key argument, if supplied, must be
in keyword form (for example, max(a,b,c,key=func)).
这是说,在您的案例中,您提供了一个列表,在本例中是
正如您所能想象的那样,对于一个复杂的对象,如
关键字参数
考虑这个示例字典:
1 | d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23} |
前任:
1 2 | >>> max(d.keys()) 'sword' |
如您所见,如果只传递不带Kwarg的iterable(
前任。您可能需要按键的长度查找最大键,而不是按字母顺序查找键的最大值:
1 2 | >>>max(d.keys(), key=lambda x: len(x)) 'artwork' |
在本例中,lambda函数返回键的长度,该键将被迭代,因此在计算值时,它将跟踪键的最大长度,并返回键的最大长度。
前任。
1 2 | >>> max(d.keys(), key=lambda x: d[x]) 'friend' |
在此示例中,lambda函数返回具有最大值的相应字典键的值