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读写ini配置文件方法实例分析
Jun 30 Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 Python
Python进阶之尾递归的用法实例
Jan 31 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
Python3 单行多行万能正则匹配方法
Jan 07 Python
python 堆和优先队列的使用详解
Mar 05 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
python 整数越界问题详解
Jun 27 Python
python命名空间(namespace)简单介绍
Aug 10 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 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
PHP 木马攻击防御技巧
2009/06/13 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
js加解密 脚本解密
2008/02/22 Javascript
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
详解vue组件开发脚手架
2018/06/15 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
python实现的解析crontab配置文件代码
2014/06/30 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
室内设计实习自我鉴定
2013/09/25 职场文书
主题教育活动总结
2014/05/05 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
python 实现的截屏工具
2021/05/08 Python
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers