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中的默认参数实例分析
Jan 29 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
对numpy中array和asarray的区别详解
Apr 17 Python
OpenCV+Python识别车牌和字符分割的实现
Jan 31 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
用python写测试数据文件过程解析
Sep 25 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
Python超越函数积分运算以及绘图实现代码
Nov 20 Python
python开发前景如何
Jun 11 Python
Python字典和列表性能之间的比较
Jun 07 Python
OpenCV 图像梯度的实现方法
Jul 25 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获取Exif缩略图的方法
2015/07/13 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
python实现简单http服务器功能
2018/09/17 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
利用Python的sympy包求解一元三次方程示例
2019/11/22 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
施工资料员岗位职责
2014/01/06 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
客户答谢会活动方案
2014/08/31 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
Python os和os.path模块详情
2022/04/02 Python