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利用splinter实现浏览器自动化操作方法
May 11 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
Oct 21 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
python redis存入字典序列化存储教程
Jul 16 Python
python设置表格边框的具体方法
Jul 17 Python
python如何删除列为空的行
Jul 17 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
Python如何telnet到网络设备
Feb 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正则表达式(regar expression)
2011/09/10 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
Javascript玩转继承(三)
2014/05/08 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
用Python编写web API的教程
2015/04/30 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
django框架创建应用操作示例
2019/09/26 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
python help函数实例用法
2020/12/06 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
导游实习生自荐书
2014/01/28 职场文书
毕业自我评价
2014/02/05 职场文书
校庆标语集锦
2014/06/25 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
三严三实对照检查材料
2014/09/22 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python