Python中min函数key参数作用及为何使用scores.get而非scores.values
关于Python中min函数key参数的疑问解答
首先明确min函数key参数的核心规则
min(iterable, key=func)中的key要求传入一个可调用对象(通常是函数)- 这个函数会依次作用在
iterable的每一个元素上,得到对应的计算值 min会根据所有计算值的大小做比较,最终返回计算值最小对应的原迭代元素,而非计算值本身
代码场景解析
你的scores是结构为{叶节点大小: 对应MAE值}的字典:
scores = {leaf_size: get_mae(leaf_size, train_X, val_X, train_y, val_y) for leaf_size in candidate_max_leaf_nodes}
直接对字典做迭代时,默认迭代的是字典的所有键,也就是所有候选的叶节点大小值。
为什么key=scores.get是对的
scores.get是字典内置的取值方法,传入一个键就会返回该键对应的值。
当min遍历每个叶节点大小(也就是scores的键)时,会把每个键传给scores.get,得到该叶节点对应的MAE值,min就会按照MAE值比较大小,最终返回MAE最小对应的那个原键(也就是叶节点大小),正好符合找最优树大小的需求。
我们可以用简单示例验证逻辑:
scores = {3: 10, 5: 8, 7: 12} best = min(scores, key=scores.get) print(best) # 输出5,正好是MAE最小的8对应的叶节点大小
为什么不能用key=scores.values
有两个核心问题:
scores.values本身是字典的内置方法,不需要接收参数,你把迭代的每个键传给它会直接抛出参数不匹配的报错;就算你写成scores.values(),它返回的是所有值的视图对象,不是可调用的函数,完全不符合key参数的输入要求。- 退一步说,就算你强行把values传进去,
min也无法把迭代的键和values里的值做一一对应匹配,根本得不到正确的比较依据。
内容的提问来源于stack exchange,提问作者Muhannad ١
相关产品推荐
相关产品推荐

