Python 中 max 函数中 key 参数的使用问题

一个字典,通过比较值返回最大值对应的键,我想到用 lambda 解析,max(dic,key=lambda i : dic[i])。 在网上看到别人有一种方法 max(dic,key=dic.get),这个把 dic.get 当做参数就有点看不懂了,有没有老哥能解释一下。


Python 中 max 函数中 key 参数的使用问题
18 回复

哪里不懂啊 你的 lambda 表达式要实现的不就是 dict.get 的功能?


max函数的key参数是用来指定一个函数,这个函数会作用在序列的每个元素上,然后根据函数的返回值来决定最大值。比如你有一个列表里是字典,想按某个键的值找最大,就可以用key=lambda x: x['key']

举个例子,找分数最高的学生:

students = [
    {'name': 'Alice', 'score': 85},
    {'name': 'Bob', 'score': 92},
    {'name': 'Charlie', 'score': 78}
]

top_student = max(students, key=lambda s: s['score'])
print(top_student)  # 输出: {'name': 'Bob', 'score': 92}

这里key=lambda s: s['score']告诉max函数比较每个字典的score值。

也可以用在自定义对象上:

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

products = [
    Product('A', 100),
    Product('B', 250),
    Product('C', 150)
]

most_expensive = max(products, key=lambda p: p.price)
print(most_expensive.name)  # 输出: B

简单说就是key让你自定义比较规则。

没有这么用的。要么用 lambda,要么用 operator.itemgetter

dic.get 返回的是什么呢,这里有点不懂

但我试了 dic.get ,确实能返回正确结果

请搜索 python getitem

嗯嗯谢谢老哥!还有一个问题想请教一下,这里的.get 不加括号 是代表 dic 的一个属性 还是 对 dic 方法的调用?

In [2]: di = {}

In [3]: di.get
Out[3]: <function get>

In [4]: lambda i: di[i]
Out[4]: <function main.<lambda>>

别误人子弟。dic.get 好好一成员函数,干嘛不能用?

https://docs.python.org/3/library/stdtypes.html?highlight=dict%20get#dict.get

“函数”也是对象。dic.get 指的就是 dic.get 这个函数,没别的意思。

顺便 dic.get 是已经绑定了 dic 这个实例的 get 成员函数。如果你用 dict.get (所以说你用 dic 这个对象名太屎了),那就是 dict 类中未绑定实例的 get 成员函数。另外一个 bonus,你有时候可以使用 dict.get(dic, i) 来调用一个未绑定的成员函数。

懂了懂了,感谢!

好的👌

懂了!万分感谢!

参数 key 接收的是 dic.get 这个函数呀

都不是 是这个函数对象本身。max 内部会去调用它。

嗯是我看错了

好吧,看成了根据 key 找到 value 最大的那个 dict 了……

这不是误人子弟……毕竟 key 依赖于一个实例对象的方法,没有 operator 稳定……

回到顶部