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时间整形转标准格式的示例分享
Feb 14 Python
python实现udp数据报传输的方法
Sep 26 Python
介绍Python的@property装饰器的用法
Apr 28 Python
python web基础之加载静态文件实例
Mar 20 Python
python list元素为tuple时的排序方法
Apr 18 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
Python利用递归实现文件的复制方法
Oct 27 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 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
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
js实现删除li标签一行内容
2019/04/16 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python psutil模块使用方法解析
2019/08/01 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
十佳美德少年事迹材料
2014/02/05 职场文书
淘宝活动策划方案
2014/02/06 职场文书
敬老模范事迹
2014/05/21 职场文书
2014年度个人工作总结
2014/11/07 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python