Python列表怎么找最大值_max()与自定义key函数提取

云宇酱_6970

云宇酱_6970

2026-03-22

526人浏览

原创

max()需用key参数按属性取最大值,不可直接调用._max();空列表须设default,字段缺失用.get()兜底,复杂逻辑提为变量或函数,itemgetter适用于简单取值,自定义类应实现__lt__或用key而非__max__。

python列表怎么找最大值_max()与自定义key函数提取

max() 函数本身不支持直接提取最大值的“某个属性”

很多人写 max(my_list)._max() 或 max(my_list).max(),结果报 AttributeError: 'int' object has no attribute '_max' —— 因为 max() 是内置函数,不是列表方法,更不存在 _max() 这种私有方法。

真正要从对象列表里按字段取最大值,得靠 key 参数。比如你有一堆字典或命名元组,想按 'score' 字段找最高分那条记录,max() 完全能干,但必须显式告诉它“比什么”。

  • max() 默认只适用于可比较类型(如数字、字符串),对字典/对象直接调用会报 TypeError: unorderable types
  • key 必须是函数,返回一个可比较的值;不能传字符串字段名(像 Pandas 那样)
  • 如果列表为空,max() 直接抛 ValueError: max() arg is an empty sequence,生产环境务必加 default=...

用 lambda 写 key 最常见,但别在循环里重复定义

比如找分数最高的学生:max(students, key=lambda x: x['score'])。这没问题,但如果你在 for 循环里反复写这个 lambda,Python 每次都会新建函数对象——不报错,但浪费内存和 CPU。

更稳的做法是把 key 提成变量或普通函数,尤其当逻辑稍复杂时(比如需要处理缺失字段、类型转换):

get_score = lambda s: s.get('score', 0)
best_student = max(students, key=get_score, default=None)
  • 用 .get('score', 0) 避免 KeyError,比直接写 x['score'] 更健壮
  • default=None 让空列表返回 None 而非崩溃,后续可用 if best_student: 判断
  • 别用 key=lambda x: int(x['score']) 强转,万一字段是空字符串或 None,这里就崩了

用 operator.itemgetter 比 lambda 稍快,但仅限取字段

如果只是单纯取字典键或元组索引,operator.itemgetter 是比 lambda 更轻量的选择,底层用 C 实现,微小但可测的性能优势,且语义更清晰:

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
from operator import itemgetter
best = max(data_list, key=itemgetter('price'))  # 字典
best = max(tuples, key=itemgetter(2))           # 元组第3个元素
  • itemgetter('name') 等价于 lambda x: x['name'],但不可处理缺失、转换、计算逻辑
  • 遇到嵌套结构(如 x['meta']['created_at'])还是得回 lambda,itemgetter 不支持链式访问
  • PyPy 下差异不大,CPython 中大量数据时能省几个微秒,但别为此牺牲可读性

自定义类要用 __lt__ 或 key,别依赖 __max__

有人以为给类加个 __max__ 方法就能让 max() 自动识别,其实 Python 根本不调用它——max() 只认 key 或对象自身的比较协议(__lt__ 等)。

两种靠谱做法:

  • 实现 __lt__:让实例天然可比,max() 就能直接用,适合“这个类天然有个主排序维度”的场景
  • 保持类干净,用 key=lambda obj: obj.priority:更灵活,不污染类定义,也避免意外影响其他排序逻辑
  • 别在 __lt__ 里写复杂逻辑或 IO,max() 内部会多次调用它,性能敏感时容易翻车

空列表、字段缺失、类型混杂——这些不是边缘情况,是线上最常触发 max() 报错的地方。写 key 时多想半秒怎么兜底,比事后查日志快得多。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1891

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5244

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1829

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

31697

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3747

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3767

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1263

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2923

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程