首页 文章

Python min / max的关键字函数

提问于
浏览
3

我试图了解这是如何工作的:

my_dict = {'a':2,'b':1}
min(my_dict, key=my_dict.get)

产生

b

这是一个非常酷的功能,我想要更好地理解 .
基于documentation

min(iterable [,key])返回可迭代中的最小项或两个或多个参数中的最小值...可选的key参数指定一个单参数排序函数,类似于list.sort() . 键参数(如果提供)必须采用关键字形式(例如,min(a,b,c,key = func)) .

我在哪里可以找到有关可用功能的更多信息?在字典的情况下,是否所有字典方法?

编辑:我今天遇到过这个:

max(enumerate(array_x), key=operator.itemgetter(1))

仍在寻找有关min / max的可用关键字函数的信息

2 回答

  • 1

    你写的代码是

    my_dict = {'a':2,'b':1}
    min(my_dict, key=my_dict.get)
    

    实际上这适用于 min 函数 . 那么,min做什么?

    min(a, b, c, ...[, key=func]) -> value
    

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

    此处的键用于传递自定义比较功能 .

    示例:输出max by list的长度,其中arg1,arg2都是列表 .

    >>>> max([1,2,3,4], [3,4,5], key=len)
    [1, 2, 3, 4]
    

    但是如果我想从列表中获取最大值,但是考虑元组的第二个元素呢?在这里我们可以使用官方documentation中给出的函数 . def 语句是复合语句,它们可以't be used where an expression is required, that'为什么有时会使用 lambda .

    请注意,lambda等同于你在def的return语句中放置的内容 . 因此,您不能在lambda中使用语句,只允许表达式 .

    >>> max(l, key = lambda i : i[1])
    (1, 9)
    
    # Or
    
    >>> import operator
    >>> max(l, key = operator.itemgetter(1))
    (1, 9)
    

    所以函数基本上取决于iterable并传递比较标准 .

    现在在您的示例中,您正在迭代字典 . 在密钥中,您在这里使用 get 方法 .

    方法get()返回给定键的值 . 如果key不可用,则返回默认值None .

    就像这里一样,在 get 方法中没有参数,它只是迭代字典的值 . 因此 min 为您提供了具有最小值的密钥 .

    对于 max(enumerate(array_x), key=operator.itemgetter(1)) ,我们想要比较数组的值而不是它们的索引 . 所以我们列举了数组 .

    枚举(thing),其中thing是迭代器或序列,返回将返回的迭代器(0,thing [0]),(1,thing1),(2,thing [2])

    现在我们使用了 itemgetter 运算符模块的功能 . operator.itemgetter(n) 构造一个可调用的函数,该函数假定一个可迭代对象(例如list,tuple,set)作为输入,并从中取出第n个元素 .

    你也可以使用这里的lambda函数

    max(enumerate(array_x), key=lambda i: i[1])
    

    所以 key 中的函数范围几乎可以使用 . 我们可以使用许多功能,但唯一的动机是,它是比较的标准 .

  • 5

    想象一下,你有一些具有某些属性的对象,你想用它来获得最小值:

    min(my_objects, key=lambda x: x.something)
    

    这将为您提供具有最小 something 属性的对象 .


    例如,在 sorted() 中存在同样的事情,因此您可以轻松地按对象派生的值进行排序 . 想象一下,你有一个人的列表,并希望按名字排序,然后姓:

    people.sort(key=lambda x: (x.first_name, x.last_name))
    

相关问题