zl程序教程

您现在的位置是:首页 >  后端

当前栏目

《Python Cookbook(第3版)中文版》——1.14 对不原生支持比较操作的对象排序

Python对象排序 操作 支持 比较 原生 中文版
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月上线运营。公众号【异步图书】,每日赠送异步新书。