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 内置字符串处理函数的使用方法
Jun 11 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
Python扩展内置类型详解
Mar 26 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
Python数据可视化:泊松分布详解
Dec 07 Python
Python环境下安装PyGame和PyOpenGL的方法
Mar 25 Python
解决flask接口返回的内容中文乱码的问题
Apr 03 Python
python数据分析工具之 matplotlib详解
Apr 09 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
jQuery Tools tab使用介绍
2012/07/14 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
Vue数据绑定简析小结
2019/05/07 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
jquery实现拖拽小方块效果
2020/12/10 jQuery
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
python操作cfg配置文件方式
2019/12/22 Python
Python netmiko模块的使用
2020/02/14 Python
Python表达式的优先级详解
2020/02/18 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
如何在pycharm中安装第三方包
2020/10/27 Python
a标签下载链接的简单实现
2016/09/13 HTML / CSS
音乐专业应届生教师求职信
2013/11/04 职场文书
党员公开承诺书范文
2014/03/25 职场文书
丧事主持词大全
2014/04/02 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
React Fragment介绍与使用详解
2021/11/11 Javascript