我是Python的新手,我一直在浏览各种内置函数的文档。
说到最大/最小功能:
`max(arg1, arg2, *args[, key])` or `max(iterable[, key])`
我知道arg1,arg2等或者iterable可能是一系列随机值,但“key”元素的作用是什么?有人能举例说明它的应用吗?
通常当我看到这个内置函数时,我会自动想象一个随机列表,说x = [1,2,3]并且go max(x)会产生3的值。但是,什么可能是“关键”功能是否让我能够通过一个简单直接的列表来操作这个函数?
我是Python的新手,并没有真正快速掌握Python Docs中的所有术语。
谢谢, 编
答案 0 :(得分:5)
该键用于传递自定义比较功能。
示例:按列表长度输出max
,其中arg1,arg2都是列表。
>>> max([1,2,3,4], [3,4,5], key=len)
[1, 2, 3, 4]
示例:通过args列表的元素总和输出最大值
>>> max([1,2,3,4,5], [3,4,5], key=sum)
[1, 2, 3, 4, 5]
>>> max([1,2,3,4], [3,4,5], key=sum)
[3, 4, 5]
您可以类似地为不同的arg对象使用特定的比较函数。
答案 1 :(得分:3)
当您想要找到序列的最大值并且您想要最大的特定定义时,可以使用它。
例如,假设我有一个tuple
列表。如果我只使用max
而不使用key
参数,它将默认使用每个元组中的第一项
>>> l = [(1,3), (2,4), (1,9), (4,1)]
>>> max(l)
(4, 1)
但是,如果我想从列表中获取最大值,但是考虑tuple
的第二个元素呢?
>>> max(l, key = lambda i : i[1])
(1, 9)
# Or
>>> import operator
>>> max(l, key = operator.itemgetter(1))
(1, 9)
还有一个字符串列表,你想找到最大值,好像它们是数值?
>>> l = ['4', '11', '6', '31']
只需使用max
按字典顺序对它们进行排序
>>> max(l)
'6'
但我再次使用key
>>> max(l, key = lambda i: int(i))
'31'
答案 2 :(得分:1)
>>> my_list = ["cat","dog","monkey","elephant","horse"]
>>> max(my_list,key=len)
'elephant'
所以在这里它将检查哪个元素具有最大长度。 所以这里键定义什么参数,max将选择最大值。
Key可以是任何内置函数或用户定义函数。
答案 3 :(得分:1)
考虑使用如下定义的对象列表:
class MyItem:
def __init__(self):
self.count = 0
def increase(self):
self.count += 1
def decrease(self):
self.count -=1
def get_count(self):
return self.count
all_objects = []
for i in range(10):
all_objects.append(MyItem())
在程序的各个点,调用方法increase
和decrease
。现在您要查找计数最多的项目,但max
函数并不知道对象实现的详细信息。因此,您需要让它知道使用哪个函数来评估它们之间的项目。在这种情况下,这将是项目的get_count
方法,您可以像这样调用max
:
max(all_objects, key=lambda x: x.get_count)
基本上,key
是"推理者"用于排序的值,用于比较。
为了更好地理解它,请考虑每次调用整数列表,如下所示:
some_list = [1,2,3]
max(some_list) # returns 3
与将密钥作为未修改的值提供相同:
some_list = [1,2,3]
max(some_list, key=lambda x:x)
作者问:
我可以将布尔值纳入关键元素吗?
所以我在答复中延长答案 简而言之,答案是:是。但在实践中,这几乎没有用。至于解释,请考虑以下情况:
my_list = [True, False, False, True, False, False, False]
max(my_list)
结果显然是True
,因为True
> False
是惯例。但问题是,返回了True
个对象(还记得所有是Python中的对象,甚至是布尔类型)?是第一个还是第二个?那么,这取决于ṁax
的内部实施。既然如此,我们就没有实际使用过这个应用程序。 (顺便提一下,max
是为了返回第一个而实现的,但目前这并不关心我们。)
重要说明:以上示例是一种简化,假设两个
True
对象实际上是两个不同的对象,这是不正确的。事实上 它们是Python中的同一个对象,正如@mu无在评论中所指出的那样。认为这是一个块状 例如,对于更相关的一个,请继续阅读。
但是让我们检查一下我们之前的例子的行为:
class MyItem:
def __init__(self, id):
self.count = 0
self._bool = bool(random.randrange(2))
self.id = id
def increase(self):
self.count += 1
def decrease(self):
self.count -=1
def get_count(self):
return self.count
def get_bool(self):
return self._bool
我们只添加了三项内容,id
用于标识对象,私有属性_bool
和 getter 函数get_bool
将用作key
。让我们创建一个这样的对象列表,并做一些随机递增来区分它们:
import random
all_objects = []
for i in range(10):
new_obj = MyItem(i)
for k in range(random.randrange(10)):
new_obj.increase()
all_objects.append(new_obj)
此时,我们有一个列表all_objects
,其中包含10个MyItem
个对象,其count
属性中包含随机值,{{1}中包含随机boolean
值属性。
现在让我们看看当我们尝试排序时会发生什么。我们将首先打印所有这些,因此更容易得出结论。我会将三个连续的结果显示为保留空间的列。
_bool
输出:
# a helper function to print formatted output
def print_object(obj):
print "id: {0} count: {1} _bool: {2}".format(o.id, o.get_count(), o.get_bool())
# print all objects followed by delimited line
# for the object returned by max
for o in all_objects: print_object(o)
print "-"*27
max_obj = max(all_objects, key=lambda x:x.get_bool())
print_object(max_obj)
从输出中我们可以清楚地看到该函数返回了第一个项,其中id: 0 count: 1 _bool: False id: 0 count: 2 _bool: False id: 0 count: 1 _bool: False
id: 1 count: 7 _bool: True id: 1 count: 3 _bool: False id: 1 count: 4 _bool: False
id: 2 count: 0 _bool: False id: 2 count: 1 _bool: False id: 2 count: 2 _bool: False
id: 3 count: 5 _bool: False id: 3 count: 4 _bool: False id: 3 count: 1 _bool: True
id: 4 count: 4 _bool: False id: 4 count: 6 _bool: False id: 4 count: 9 _bool: False
id: 5 count: 4 _bool: False id: 5 count: 6 _bool: False id: 5 count: 3 _bool: False
id: 6 count: 7 _bool: True id: 6 count: 4 _bool: False id: 6 count: 5 _bool: False
id: 7 count: 8 _bool: True id: 7 count: 7 _bool: True id: 7 count: 1 _bool: True
id: 8 count: 1 _bool: True id: 8 count: 8 _bool: False id: 8 count: 9 _bool: False
id: 9 count: 7 _bool: True id: 9 count: 4 _bool: False id: 9 count: 1 _bool: False
--------------------------- --------------------------- ---------------------------
id: 1 count: 7 _bool: True id: 7 count: 7 _bool: True id: 3 count: 1 _bool: True
属性包含值_bool
。哪个是重要的True
......