《Python Cookbook(第3版)中文版》——1.14 对不原生支持比较操作的对象排序
2023-09-11 14:17:38 时间
本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第1章,第1.14节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.14 对不原生支持比较操作的对象排序 1.14.1 问题我们想在同一个类的实例之间做排序,但是它们并不原生支持比较操作。
1.14.2 解决方案内建的sorted()函数可接受一个用来传递可调用对象(callable)的参数key,而该可调用对象会返回待排序对象中的某些值,sorted则利用这些值来比较对象。例如,如果应用中有一系列的User对象实例,而我们想通过user_id属性来对它们排序,则可以提供一个可调用对象将User实例作为输入然后返回user_id。示例如下:
class User: ... def __init__(self, user_id): ... self.user_id = user_id ... def __repr__(self): ... return User({}).format(self.user_id) users = [User(23), User(3), User(99)] users [User(23), User(3), User(99)] sorted(users, key=lambda u: u.user_id) [User(3), User(23), User(99)]
除了可以用lambda表达式外,另一种方式是使用operator.attrgetter()。
from operator import attrgetter sorted(users, key=attrgetter(user_id)) [User(3), User(23), User(99)]1.14.3 讨论
要使用lambda表达式还是attrgetter()或许只是一种个人喜好。但是通常来说,attrgetter()要更快一些,而且具有允许同时提取多个字段值的能力。这和针对字典的operator.itemgetter()的使用很类似(参见1.13节)。例如,如果User实例还有一个first_name和last_name属性的话,可以执行如下的排序操作:
by_name = sorted(users, key=attrgetter(last_name, first_name))
同样值得一提的是,本节所用到的技术也适用于像min()和max()这样的函数。例如:
min(users, key=attrgetter(user_id) User(3) max(users, key=attrgetter(user_id) User(99)
[雪峰磁针石博客]python代码风格指南(PEP8中文版) 本文给出主Python版本标准库的编码约定。CPython的C代码风格参见PEP7。 本文和PEP 257 文档字符串标准改编自Guido最初的《Python Style Guide》, 并增加了Barry的GNU Mailman Coding Style Guide的部分内容。
GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常丰富,涉及面非常广。awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Python 操作 Kafka --- kafka-python
- python执行脚本加参数_命令行运行Python脚本时传入参数的三种方式详解以及argparse子命令subparsers()方法
- Python读取键盘输入
- python 对象
- Google Earth Engine(python/Java)——卷积神经网络第3部分
- 零基础教你快速入门Python怎么学python入门?python新手学习路线
- 24岁非计算机专业工科妹子裸辞转行Python程序员,自学Python三个月,零基础如何系统学习python,从入门到精通?
- python内置函数bin()用法详解
- python强大之处在哪里?为什么那么多人喜欢Python?
- 35岁了转行python可以吗?什么样的人合适学习Python?
- Python-OpenCV中不用函数split()的实现图像多通道分离的方法——ndraary对象切片实现
- 在Python中什么样的对象布尔(bool)值为False,什么样的对象布尔(bool)值为True【可以用内置函数bool()判断对象的布尔值】
- Python自动化测试面试题-编程篇
- Python 类和对象
- 【Python】调用C/C++ SDK/SO动态库
- 《Python密码学编程》——2.6 本书的文本换行
- 《像计算机科学家一样思考Python(第2版)》——2.4 脚本模式
- 《Python数据可视化编程实战》—— 1.9 为项目设置matplotlib参数
- 【Python分布式服务框架】python实现gRPC服务
- 华为OD机试 - 单词倒序(Python) | 机试题+算法思路+考点+代码解析 【2023】
- Python源代码--整数对象(PyIntObject)的内存池
- 【图像处理】——Python霍夫变换之直线检测(主要是两个函数Houghlines&HoughlinesP)
- Python基础题
- python模块导入的多种方式