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

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)
>>>
时间: 2024-09-20 18:21:32

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

《Python Cookbook(第3版)中文版》——导读

前 言 自2008年以来,我们已经目睹了整个Python世界正缓慢向着Python 3进化的事实.众所周知,完全接纳Python 3要花很长的时间.事实上,就在写作本书时(2013年),大多数Python程序员仍然坚持在生产环境中使用Python 2.关于Python 3不能向后兼容的事实也已经做了许多努力来补救.的确,向后兼容性对于任何已经存在的代码库来说是个问题.但是,如果你着眼于未来,你会发现Python 3带来的好处绝非那么简单. 正因为Python 3是着眼于未来的,本书在之前的版本上

《Python Cookbook(第3版)中文版》——1.18 将名称映射到序列的元素中

1.18 将名称映射到序列的元素中 1.18.1 问题 我们的代码是通过位置(即索引,或下标)来访问列表或元组的,但有时候这会使代码变得有些难以阅读.我们希望可以通过名称来访问元素,以此减少结构中对位置的依赖性. 1.18.2 解决方案 相比普通的元组,collections.namedtuple()(命名元组)只增加了极小的开销就提供了这些便利.实际上collections.namedtuple()是一个工厂方法,它返回的是Python中标准元组类型的子类.我们提供给它一个类型名称以及相应的字

谁有<<CLR Via C#>>第三版中文版的电子书

问题描述 谁有<<CLRViaC#>>第三版中文版的电子书,我是个初学者,看网上推荐此书的人多,想看一下,我的QQ:330784617.谢谢!! 解决方案 解决方案二:试一试我一般看英文的,虽然很少看书:(解决方案三: 解决方案四:第二版有的,想看第三版.

拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高级主题 两大部分,以 Python 2.x 作为主要演示版本,涵盖的知识面广,知识点较齐全,代码多且好理解,但对 Python 版本特性的内容太久远,不合时宜. 整体来说 Python 核心 部分是主要内容,高级主题 部分作为应用扩展内容.后半部分篇幅较短,内容不够深入,只到了解的层面,好在横向够广(每一个主

(六十二)第四章总结——《C++ Primer Plus 第6版 中文版》

书是<C++ Primer Plus  第6版  中文版> 数组.指针.结构 是C++的3种复合类型.   注:为了方便,类型名用int为主,变量名用a为主.   数组: 包括数组(例如int a[10];)和字符串(例如char a[10];),还有string类(例如string a="abc";),vector类(例如vector<int>a(5)).array类(array<int,3>a)等. 数组名表示数组所在的(第一个元素)内存地址.

求大神解答一下-C++ primer plus 第6版 中文版 第16章复习题的一个问题

问题描述 C++ primer plus 第6版 中文版 第16章复习题的一个问题 奇葩的是课后居然没答案...... 求正规.严谨.简洁的标准答案! 程序清单16.15(在p708页):functor.cpp //functor.cpp--using a functor #include尖括号iostream尖括号 #include尖括号list尖括号 #include尖括号iterator尖括号 #include尖括号algorithm尖括号 template//functor class

【转】c++.primer.plus.第五版.中文版[下载]

c++.primer.plus.第五版.中文版[下载] 一共有5部分.全部下载完才可解压阅读. c++.primer.plus.第五版.中文版(一) c++.primer.plus.第五版.中文版(二) c++.primer.plus.第五版.中文版(三) c++.primer.plus.第五版.中文版(四) c++.primer.plus.第五版.中文版(五) "在遇到无法解决的问题时,我总会求助于C++ Primer一书."--Bruce Eckel,"编程思想"

intellij idea-MAC版 IntelliJ IDEA 14 Keygen

问题描述 MAC版 IntelliJ IDEA 14 Keygen 给位大神,请问一下苹果系统怎么安装 IntelliJ IDEA 14,急用,谢谢! 解决方案 直接安装就可以啊,mac下面应该是一个可执行文件,具体你看下官方的,key的话,一般是通用的,你网上找一下.

PS3版《最终幻想14》的发售日期变得未知

原本预计在2011年3月初全球发售的PS3版<最终幻想14>的发售日期变得未知. 对于PS3版<最终幻想14>的发售日期推迟,史克威尔·艾尼克斯公司表示,推迟发售是为了进一步改善PS3版<最终幻想14>,而不是简简单单把电脑版移植过去. 实际上,史克威尔·艾尼克斯的此次决定等于是承认电脑版<最终幻想14>的失败.电脑版<最终幻想14>在11月26日更新之后,目前还是在进行着免费运营. 由于电脑版<最终幻想14>的失败,制作人田中弘道已