Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018-03-15 12:00
826 查看
问题:想在同一个类的实例之间做排序,但是它们并不原生支持比较操作。
解决方案:使用内建的
sorted()函数可接受一个用来传递可调用对象的参数key,sorted利用该可调用对象返回的待排序对象中的某些值来比较对象。
from operator import attrgetter class User: def __init__(self, user_id): self.user_id = user_id def __repr__(self): return 'User({})'.format(self.user_id) # Example users = [User(23), User(3), User(99)] print(users) # Sort it by user-id used lambda表达式 print(sorted(users,key=lambda r:r.user_id)) # Sort it by user-id used operator.attrgetter() print(sorted(users, key=attrgetter('user_id')))
使用lambda表达式还是
operator.attrgetter()或许只是个人偏好,但是
operator.attrgetter()更快一些,而且具有允许同时提取多个字段值的能力。
这和针对字典的
operator.itemgetter()的使用类似。
from operator import attrgetter class User: def __init__(self, user_id,fname,lname): self.user_id = user_id self.fname=fname self.lname=lname def __repr__(self): return 'User({},{},{})'.format(self.user_id,self.fname,self.lname) # Example users = [User(23,'Brian','Jones'), User(3,'David','Beazley'), User(99,'Aig','Jones')] print(users) # Sort it by lname,fname used operator.attrgetter() print(sorted(users, key=attrgetter('lname','fname')))
>>> ================================ RESTART ================================ >>> [User(23,Brian,Jones), User(3,David,Beazley), User(99,Aig,Jones)] [User(3,David,Beazley), User(99,Aig,Jones), User(23,Brian,Jones)] >>>
最后,本节展示的技术同样适用于
min()和
max()这样的函数:
>>> min(users,key=attrgetter('user_id')) User(3,David,Beazley) >>> max(users,key=attrgetter('user_id')) User(99,Aig,Jones) >>> max(users,key=attrgetter('fname')) User(3,David,Beazley)
(代码摘自《Python Cookbook》)
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
您可能感兴趣的文章:
- 常用python数据类型转换函数总结
- 浅谈Python数据类型之间的转换
- Python实现列表转换成字典数据结构的方法
- python 数据清洗之数据合并、转换、过滤、排序
- python数据预处理之将类别数据转换为数值的方法
- python数据结构之二叉树的统计与转换实例
- 浅谈python数据类型及类型转换
- 利用python将json数据转换为csv格式的方法
- Python cookbook(数据结构与算法)对切片命名清除索引的方法
- Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
- Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
- Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
相关文章推荐
- Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
- Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
- Python: attrgetter()函数: 排序不支持原生比较的对象
- Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
- python 7-5 如何让类支持比较操作lt/le/total_ordering可以简化此过程,实现lt eq 后,可以推测出<= >=方法
- Python cookbook(数据结构与算法)实现优先级队列的方法示例
- Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
- python 的时间操作datetime ,不支持减年或月阿!!自己实现
- 在Tkinter实现一个秒表(参照python cookbook)
- python CookBook 3 1.2 拆解任意长度的可迭代对象
- Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
- python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性
- Python cookbook(数据结构与算法)让字典保持有序的方法
- Python Cookbook 4.1 复制(拷贝)对象(浅复制和深复制)
- Python cookbook(数据结构与算法)保存最后N个元素的方法
- python cookbook第三版学习笔记十四:类和对象(五)代理类以及内存回收
- [00014]排序不支持原生比较的对象
- python cookbook第三版学习笔记十:类和对象(一)
- Python Cookbook 4.1 复制(拷贝)对象(浅复制和深复制)
- Python Cookbook 第二版 汉化版 [Recipe 1.3] 测试一个对象是否为 String-like 对象