Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例


Posted in Python onMarch 15, 2018

本文实例讲述了Python实现对不原生支持比较操作的对象排序算法。分享给大家供大家参考,具体如下:

问题:想在同一个类的实例之间做排序,但是它们并不原生支持比较操作。

解决方案:使用内建的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有点火? 给你7个学习它的理由!
Jun 26 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
Python subprocess模块详细解读
Jan 29 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
pandas 数据结构之Series的使用方法
Jun 21 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
python 有效的括号的实现代码示例
Nov 11 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
解决flask接口返回的内容中文乱码的问题
Apr 03 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
python简单商城购物车实例代码
Mar 15 #Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 #Python
python批量实现Word文件转换为PDF文件
Mar 15 #Python
python实现求解列表中元素的排列和组合问题
Mar 15 #Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 #Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
Mar 15 #Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 #Python
You might like
php5 图片验证码实现代码
2009/12/11 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
vue使用Google地图的实现示例代码
2018/12/19 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
JS实现多功能计算器
2020/10/28 Javascript
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
用python制作游戏外挂
2018/01/04 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
地球一小时倡议书
2014/04/15 职场文书
节约能源标语
2014/06/17 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
2014年标准化工作总结
2014/12/17 职场文书
社区重阳节活动总结
2015/03/24 职场文书
廉洁自律证明
2015/06/24 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL