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 Sleep休眠函数使用简单实例
Feb 02 Python
在Django框架中运行Python应用全攻略
Jul 17 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
Python图像处理之识别图像中的文字(实例讲解)
May 10 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
Python assert语句的简单使用示例
Jul 28 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
python梯度下降算法的实现
Feb 24 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
python opencv通过按键采集图片源码
May 20 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
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
生产管理的三大手法
2013/11/11 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
经典英文广告词
2014/03/18 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
丧事答谢词
2015/01/05 职场文书