Python Max / Min函数的工作原理和关键是什么?

时间:2014-12-15 14:30:00

标签: python function

我是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中的所有术语。

谢谢, 编

4 个答案:

答案 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())

在程序的各个点,调用方法increasedecrease。现在您要查找计数最多的项目,但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 ......