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中while循环语句用法简单实例
May 07 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
python paramiko模块学习分享
Aug 23 Python
python中logging包的使用总结
Feb 28 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
python tkinter组件摆放方式详解
Sep 16 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
python爬虫基础知识点整理
Jun 02 Python
浅谈如何使用python抓取网页中的动态数据实现
Aug 17 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
python多线程方法详解
Jan 18 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使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
python创建关联数组(字典)的方法
2015/05/04 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Windows下安装Scrapy
2018/10/17 Python
python后端接收前端回传的文件方法
2019/01/02 Python
python issubclass 和 isinstance函数
2019/07/25 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
大学社团活动策划书
2014/01/26 职场文书
家长会主持词开场白
2014/03/18 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
学生安全责任书范本
2014/07/24 职场文书
学校创先争优活动总结
2014/08/28 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
办理护照工作证明
2014/10/10 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
销售业务员岗位职责
2015/02/13 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android